poj4049

来源:互联网 发布:itunes软件 编辑:程序博客网 时间:2024/05/18 16:15
//============================================================================// Name        : 4049.cpp// Author      : // Version     :// Copyright   : Your copyright notice// Description : Hello World in C++, Ansi-style//============================================================================#include <stdio.h>using namespace std;#define N 4typedef enum result {WIN, TIE, LOSE, UNKNOWN} Result;int x[N][N];Result want;int empty;int xxx;void outX() {for (int i = 0; i < N; i++) {for (int j = 0; j < N; j++) {printf("%d", x[i][j]);}puts("");}puts("");}Result getResult() {int sum1 = 0;int sum2 = 0;for (int i = 0; i < N; i++) {sum1 += x[i][i];sum2 += x[i][N - 1 - i];int sum3 = 0;int sum4 = 0;for (int j = 0; j < N; j++) {sum3 += x[i][j];sum4 += x[j][i];}if ((sum3 & 4) || (sum4 & 4)) {if (xxx)return WIN;elsereturn LOSE;}if ((sum3 & 32) || (sum4 & 32)) {if (xxx)return LOSE;elsereturn WIN;}}if ((sum1 & 4) || (sum2 & 4)) {if (xxx)return WIN;elsereturn LOSE;}if ((sum1 & 32) || (sum2 & 32)) {if (xxx)return LOSE;elsereturn WIN;}if (empty == 0) {return TIE;} else {return UNKNOWN;}}bool succeed(bool self) {if (self) {for (int i = 0; i < N; i++)for (int j = 0; j < N; j++) {if (x[i][j] == 0) {if (xxx)x[i][j] = 1;elsex[i][j] = 8;empty--;Result rs = getResult();if (rs == want) {x[i][j] = 0;empty++;return true;} else if (rs == UNKNOWN) {if (succeed(false)) {x[i][j] = 0;empty++;return true;} else {x[i][j] = 0;empty++;}} else {x[i][j] = 0;empty++;}}}return false;} else {for (int i = 0; i < N; i++)for (int j = 0; j < N; j++) {if (x[i][j] == 0) {if (xxx)x[i][j] = 8;elsex[i][j]=1;empty--;Result rs = getResult();if (rs == UNKNOWN) {if (!succeed(true)) {x[i][j] = 0;empty++;return false;} else {x[i][j] = 0;empty++;}} else if (rs != want) {x[i][j] = 0;empty++;return false;} else {x[i][j] = 0;empty++;}}}return true;}}int main() {int t;scanf("%d", &t);char str[5];while (t--) {scanf("%s", str);switch (str[0]) {case 'L':want = LOSE;break;case 'W':want = WIN;break;case 'T':want = TIE;break;}empty = 0;xxx = 1;for (int i = 0; i < N; i++) {scanf("%s", str);for (int j = 0; j < N; j++) {switch (str[j]) {case '.':x[i][j] = 0;empty++;break;case 'x':x[i][j] = 1;xxx--;break;case 'o':x[i][j] = 8;xxx++;break;}}}bool su = succeed(true);if (su)puts("YES");elseputs("NO");}return 0;}

原创粉丝点击