Амихандаа хиймэл оюун ухаантай байхаар л бодсон юм шүү дээ. Хиймэл оюун ухаан гэх ч юм уу даа. Хоёр тоглогч хамгийн сайнаараа нүүдэг байхаар л бодож хийсэн юм.
http://www.spoj.com/CSMS/problems/CSMS0006/
#include <stdio.h>
char board[3][4];
struct NUD
{
int h;
int x;
int y;
}nud[4];
int f(char p, int n);
void print()
{
int i, j;
for(i = 0; i < 3; i++)
{
for(j = 0; j < 3; j++)
putchar(board[i][j]);
putchar('\n');
}
putchar('\n');
}
int main()
{
int i;
int j;
int k = 0;
int winner;
for(i = 0; i < 3; i++)
for(j = 0; j < 4; j++)
{
board[i][j] = getchar();
if(board[i][j] == '#')
{
nud[k].h = 1;
nud[k].x = i;
nud[k].y = j;
k++;
}
}
winner = f('X', 3);
switch(winner)
{
case 2: printf("X"); break;
case 1: printf("#"); break;
case 0: printf("O"); break;
}
return 0;
}
int f(char p, int n)
{
int i;
int minPoint = 2, point;
//print();
for(i = 0; i < 3; i++)
{
if(nud[i].h == 0)
continue;
board[nud[i].x][nud[i].y] = p;
//print();
if((board[0][nud[i].y] == p && board[1][nud[i].y] == p && board[2][nud[i].y] == p) ||
(board[nud[i].x][0] == p && board[nud[i].x][1] == p && board[nud[i].x][2] == p) ||
(board[0][0] == p && board[1][1] == p && board[2][2] == p) ||
(board[0][2] == p && board[1][1] == p && board[2][0] == p))
return 2;
board[nud[i].x][nud[i].y] = '#';
}
if(n == 1) return 1;
for(i = 0; i < 3; i++)
{
if(nud[i].h == 0)
continue;
board[nud[i].x][nud[i].y] = p;
nud[i].h = 0;
point = f((p == 'X')?'O':'X', n - 1);
if(point < minPoint)
minPoint = point;
board[nud[i].x][nud[i].y] = '#';
nud[i].h = 1;
}
return (minPoint == 2)? 0 : (minPoint == 0) ? 2 : 1;
}

No comments:
Post a Comment