poj4049 chess金华邀请赛题
竟然因为开的str数组为str[4][4],害我调试了一个小时,天呐~~~~
#include<iostream>#include<cstdlib>#include<stdio.h>#include<string.h>#include<string>using namespace std;char str[6][6];char ss[10];int change(int x,int y){ return (x-1)*4+y;}bool istrue(int x,int temp){ return (x&(1<<temp));}bool iswin(int x){ bool flag; for(int i=1;i<=4;i++) { flag=true; for(int j=1;j<=4;j++) { int temp=change(i,j); if(!istrue(x,temp)) {flag=false;break;} } if(flag) return true; } for(int j=1;j<=4;j++) { flag=true; for(int i=1;i<=4;i++) { int temp=change(i,j); if(!istrue(x,temp)){flag=false;break;} } if(flag) return true; } flag=true; for(int i=1;i<=4;i++) { int temp=change(i,i); if(!istrue(x,temp)){flag=false;break;} } if(flag) return true; flag=true; for(int i=1;i<=4;i++) { int temp=change(5-i,i); if(!istrue(x,temp)) {flag=false;break;} } if(flag) return true; return false;}bool isWIN(int step,int x,int y,bool who){ if(iswin(x)) return true; if(iswin(y)) return false; if(step>=17) return false; if(who) { for(int i=1;i<=16;i++) { if(!istrue(x,i)&&!istrue(y,i)) { if(isWIN(step+1,x+(1<<i),y,false)) return true; } } return false; } else { for(int i=1;i<=16;i++) { if(!istrue(x,i)&&!istrue(y,i)) { if(!isWIN(step+1,x,y+(1<<i),true)) return false;/// } } return true; }}bool islose(int step,int x,int y,bool who){ if(iswin(x)) return false; if(iswin(y)) return true; if(step>=17) return false; if(who) { for(int i=1;i<=16;i++) { if(!istrue(x,i)&&!istrue(y,i)) { // x|=(1<<i); if(islose(step+1,x+(1<<i),y,false)) return true; } } return false; } else { for(int i=1;i<=16;i++) { if(!istrue(x,i)&&!istrue(y,i)) { //y|=(1<<i); if(!islose(step+1,x,y+(1<<i),true)) return false;/// } } return true; }}bool istie(int step,int x,int y,bool who){ if(iswin(x)) return false; if(iswin(y)) return false; if(step>=17) return true; if(who) { for(int i=1;i<=16;i++) { if(!istrue(x,i)&&!istrue(y,i)) { // x|=(1<<i); if(istie(step+1,x+(1<<i),y,false)) return true; } } return false; } else { for(int i=1;i<=16;i++) { if(!istrue(x,i)&&!istrue(y,i)) { // y|=(1<<i); if(!istie(step+1,x,y+(1<<i),true))/// return false; } } return true; }}bool solve(int sx,int sy){ int x=0; int y=0; if(sx==sy) { for(int i=1;i<=4;i++) for(int j=1;j<=4;j++) { int temp=change(i,j); if(str[i][j]=='x') x|=1<<temp; else if(str[i][j]=='o') y|=1<<temp; } } else { for(int i=1;i<=4;i++) for(int j=1;j<=4;j++) { int temp=change(i,j); if(str[i][j]=='o') x|=1<<temp; else if(str[i][j]=='x') y|=1<<temp; } } int step = sx+sy +1; if(!strcmp(ss,"LOSE")) { return islose(step,x,y,true); } else if(!strcmp(ss,"WIN")) { return isWIN(step,x,y,true); } else if(!strcmp(ss,"TIE")) { return istie(step,x,y,true); }}int main(){ int t; scanf("%d",&t); while(t--) { cin>>ss; int sx=0; int sy=0; for(int i=1;i<=4;i++) for(int j=1;j<=4;j++) { cin>>str[i][j]; if(str[i][j]=='x') sx++; else if(str[i][j]=='o') sy++; } if(solve(sx,sy)) puts("YES"); else puts("NO"); }}