一開始想的很簡單,
考慮不全,連吃幾次WA。
重點如下:
1. X先下。所以X要嘛跟O相等,要嘛比O多1。
2. O勝利的情況,至多一條線且X跟O需相等。
3. X勝利的情況
(a)兩條線,X要多O一個,且九格皆佔滿。
(b)一條線,X要多O一個。
4.不會有O勝利且X勝利的情況。
每次否定邏輯語句我都會把&&跟||用錯 =.=,
狄摩根定律跟括號問題……Orz
/* ACM 10363 Tic Tac Toe
* mythnc
* 2012/01/04 14:26:07
* run time: 0.012
*/
#include <>
#define SQUARE 3
#define TRUE 1
#define FALSE 0
void input(char (*)[]);
int legal(char (*)[]);
int main(void)
{
char tic[SQUARE][SQUARE + 1];
int n, i;
scanf("%d", &n);
for (i = 0; i < n; i++) {
input(tic);
if (legal(tic))
printf("yes\n");
else
printf("no\n");
}
return 0;
}
/* input: receive input data */
void input(char (*t)[SQUARE + 1])
{
int i;
for (i = 0; i < 3; i++)
scanf("%s", t[i]);
}
/* legal: if square is legal return TRUE
* else return FALSE */
int legal(char (*t)[SQUARE + 1])
{
int counto, countx, linex, lineo;
int i, j;
for (counto = countx = i = 0; i < 3; i++)
for (j = 0; j < 3; j++)
if (t[i][j] == 'O')
counto++;
else if (t[i][j] == 'X')
countx++;
/* if X - O is not 1 or 0 is illegal */
if (!(countx - counto == 0 || countx - counto == 1))
return FALSE;
/* vertical and horizontal line */
for (i = lineo = linex = 0; i < 3; i++) {
if (t[i][0] == t[i][1] && t[i][1] == t[i][2])
if (t[i][0] == 'O')
lineo++;
else if (t[i][0] == 'X')
linex++;
if (t[0][i] == t[1][i] && t[1][i] == t[2][i])
if (t[0][i] == 'O')
lineo++;
else if (t[0][i] == 'X')
linex++;
}
/* diagonal line */
if (t[0][0] == t[1][1] && t[1][1] == t[2][2])
if (t[1][1] == 'O')
lineo++;
else if (t[1][1] == 'X')
linex++;
if (t[2][0] == t[1][1] && t[1][1] == t[0][2])
if (t[1][1] == 'O')
lineo++;
else if (t[1][1] == 'X')
linex++;
if (lineo > 1 || linex > 2)
return FALSE;
if (lineo == 1 && !(linex == 0 && counto == countx))
return FALSE;
if (linex == 1 && !(lineo == 0 && countx - counto == 1))
return FALSE;
if (linex == 2 && !(lineo == 0 && countx + counto == 9))
return FALSE;
return TRUE;
}
沒有留言:
張貼留言