棋局评估
#include<cstdio> #include<iostream> #include<algorithm> #include<vector> #include<string> #include<stack> #include<map> using namespace std; int a[5][5],h; struct Pos { int x,y; }pos[20]; int value(int x,int y,int type) //评价此时局面 { int start = a[x][y]; a[x][y] = type; int temp; if(type == 1) temp = 2; else temp = 1; //直接胜利 if(a[1][1] == type && a[2][2] == type && a[3][3] == type) return 100000; if(a[1][3] == type && a[2][2] == type && a[3][1] == type) return 100000; for(int i=1;i<=3;i++) { if(a[i][1] == type && a[i][2] == type && a[i][3] == type) return 100000; if(a[1][i] == type && a[2][i] == type && a[3][i] == type) return 100000; } int sum = 0; //对方有2连枝, // 一开始没注意,2连枝,每一直线有3种情况 if(a[1][1] == temp && a[2][2] == temp && a[3][3] == 0) sum += -100000; if(a[3][3] == temp && a[2][2] == temp && a[1][1] == 0) sum += -100000; if(a[1][1] == temp && a[3][3] == temp && a[2][2] == 0) sum += -100000; if(a[3][3] == temp && a[2][2] == temp && a[1][1] == 0) sum += -100000; if(a[1][3] == temp && a[2][2] == temp && a[3][1] == 0) sum += -100000; if(a[3][1] == temp && a[1][3] == temp && a[2][2] == 0) sum += -100000; for(int i=1;i<=3;i++) { if(a[i][1] == temp && a[i][2] == temp && a[i][3] == 0) sum += -100000; if(a[i][2] == temp && a[i][3] == temp && a[i][1] == 0) sum += -100000; if(a[i][1] == temp && a[i][3] == temp && a[i][2] == 0) sum += -100000; if(a[1][i] == temp && a[2][i] == temp && a[3][i] == 0) sum += -100000; if(a[2][i] == temp && a[3][i] == temp && a[1][i] == 0) sum += -100000; //i 和 数字 写反了 if(a[1][i] == temp && a[3][i] == temp && a[2][i] == 0) sum += -100000; } //对方有单连枝 if(a[1][1] == temp && a[2][2] == 0 && a[3][3] == 0) sum += -10; if(a[2][2] == temp && a[3][3] == 0 && a[1][1] == 0) sum += -10; if(a[3][3] == temp && a[2][2] == 0 && a[1][1] == 0) sum += -10; if(a[1][3] == temp && a[2][2] == 0 && a[3][1] == 0) sum += -10; if(a[3][1] == temp && a[2][2] == 0 && a[1][3] == 0) sum += -10; if(a[2][2] == temp && a[3][1] == 0 && a[1][3] == 0) sum += -10; for(int i=1;i<=3;i++) { if(a[i][1] == temp && a[i][2] == 0 && a[i][3] == 0) sum += -10; if(a[i][2] == temp && a[i][3] == 0 && a[i][1] == 0) sum += -10; if(a[i][3] == temp && a[i][2] == 0 && a[i][1] == 0) sum += -10; if(a[1][i] == temp && a[2][i] == 0 && a[3][i] == 0) sum += -10; if(a[2][i] == temp && a[3][i] == 0 && a[1][i] == 0) sum += -10; if(a[3][i] == temp && a[2][i] == 0 && a[1][i] == 0) sum += -10; } //每有一个2连枝且有机会组成3连枝 加100分 if(a[1][1] == type && a[2][2] == type && a[3][3] == 0) sum += 100; if(a[3][3] == type && a[2][2] == type && a[1][1] == 0) sum += 100; if(a[3][3] == type && a[1][1] == type && a[2][2] == 0) sum += 100; if(a[1][3] == type && a[2][2] == type && a[3][1] == 0) sum += 100; if(a[3][1] == type && a[2][2] == type && a[1][3] == 0) sum += 100; if(a[3][1] == type && a[1][3] == type && a[2][2] == 0) sum += 100; for(int i=1;i<=3;i++) { if(a[i][1] == type && a[i][2] == type && a[i][3] == 0) sum += 100; if(a[i][2] == type && a[i][3] == type && a[i][1] == 0) sum += 100; if(a[i][1] == type && a[i][3] == type && a[i][2] == 0) sum += 100; if(a[1][i] == type && a[2][i] == type && a[3][i] == 0) sum += 100; if(a[2][i] == type && a[3][i] == type && a[1][i] == 0) sum += 100; if(a[1][i] == type && a[3][i] == type && a[2][i] == 0) sum += 100; } //每有一个单连枝且有机会组成3连枝 加10分 if(a[1][1] == type && a[2][2] == 0 && a[3][3] == 0) sum += 10; if(a[2][2] == type && a[3][3] == 0 && a[1][1] == 0) sum += 10; if(a[3][3] == type && a[2][2] == 0 && a[1][1] == 0) sum += 10; if(a[1][3] == type && a[2][2] == 0 && a[3][1] == 0) sum += 10; if(a[3][1] == type && a[2][2] == 0 && a[1][3] == 0) sum += 10; if(a[2][2] == type && a[3][1] == 0 && a[1][3] == 0) sum += 10; for(int i=1;i<=3;i++) { if(a[i][1] == type && a[i][2] == 0 && a[i][3] == 0) sum += 10; if(a[i][2] == type && a[i][3] == 0 && a[i][1] == 0) sum += 10; if(a[i][3] == type && a[i][2] == 0 && a[i][1] == 0) sum += 10; if(a[1][i] == type && a[2][i] == 0 && a[3][i] == 0) sum += 10; if(a[2][i] == type && a[3][i] == 0 && a[1][i] == 0) sum += 10; if(a[3][i] == type && a[2][i] == 0 && a[1][i] == 0) sum += 10; } //printf("%d %d %d\n",x,y,sum); a[x][y] = start; return sum; } int select(int ct) { while(1) { if(ct == 0 ) break; if(ct % 2 == 1) { int max = -100,posi,num; for(int i=0;i<h;i++) { if(pos[i].x != 0 && pos[i].y != 0 ) { num = value(pos[i].x,pos[i].y,1); if(max < num) { max = num; posi = i; } } } if(max == 100000) return ct; a[pos[posi].x][pos[posi].y] = 1; pos[posi].x = 0; pos[posi].y = 0; } else { int max = -100,posi,num; for(int i=0;i<h;i++) { if(pos[i].x != 0 && pos[i].y != 0 ) { num = value(pos[i].x,pos[i].y,2); if(max < num) { max = num; posi = i; } } } if(max == 100000) return -ct; a[pos[posi].x][pos[posi].y] = 2; pos[posi].x = 0; pos[posi].y = 0; } ct--; } return 0; } int main() { int t; scanf("%d",&t); for(int x=0;x<t;x++) { int sum = 0; h = 0; for(int i=1;i<=3;i++) { for(int j=1;j<=3;j++) { scanf("%d",&a[i][j]); if(a[i][j] == 0) { sum++; pos[h].x = i; pos[h].y = j; h++; } } } if(value(0,0,1) == 100000) printf("%d\n",sum+1); else if(value(0,0,2) == 100000) printf("%d\n",-(sum+1)); else printf("%d\n",select(sum)); } return 0; }