const int N = 10;
const int UNKNOW = 2;
const int TRUE = 1;
const int FALSE = 0;
char win[1 << N], choose[1 << N];
int take(int &now, int p)
{
if ((p < 1) || (p > N))
{
return FALSE;
}
int mask = 1 << (p - 1);
if ((now & mask) != 0)
{
now -= mask;
for (int k = 1; k <= p; k ++)
{
if ((p % k) == 0)
{
take(now, k);
}
}
return TRUE;
}
return FALSE;
}
int calc(int can)
{
if (win[can] == UNKNOW)
{
win[can] = FALSE;
for (int i = 1; i <= N; i ++)
{
int x = can;
if (take(x, i))
{
if (!calc(x))
{
choose[can] = i;
win[can] = TRUE;
break;
}
}
}
}
return win[can];
}
void main()
{
memset(win, UNKNOW, sizeof(win));
cout << "N = " << N << endl;
int now = (1 << N) - 1;
do
{
if (calc(now))
{
cout << "computer take " << (int) choose[now] << endl;
take(now, choose[now]);
}
if (!calc(now))
{
int choose;
do
{
cout << "It's your turn: ";
if (now == 0)
{
cout << "Fail" << endl;
cout << endl;
cout << "Press any key to continue ... " << endl;
getch();
break;
}
cin >> choose;
} while (!take(now, choose));
}
} while (now != 0);
}