http://acm.timus.ru/problem.aspx?space=1&num=1195
题目很简单 但是写了一下午 原因是理解错了题意 (英语不好,伤不起呀)
题目大意:
以五子棋为背景 这不过这里是 "三子棋" 而且每个人已经走了三步
问剩下的 两个人都选择最优走法 谁获胜 还是平局
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<vector> #include<queue> #include<map> #include<stack> #include<algorithm> #include<cmath> using namespace std; //#pragma comment(linker,"/STACK:1000000000,1000000000") #define LL long long const int INF=0x3f3f3f3f; //const int N=100005; string s; int mov[10][8]; int dfso(); bool threeline(char w) { for(int i=0;i<9;++i) { if(s[i]!=w) continue; for(int j=0;j<8;j+=2) if(mov[i][j]!=-1&&s[mov[i][j]]==w&&mov[i][j+1]!=-1&&s[mov[i][j+1]]==w) return true; } return false; } int dfsc() { if(threeline('O')) return 0; int k=3; for(int i=0;i<9;++i) { if(s[i]=='#') { s[i]='X'; k=min(k,dfso()); s[i]='#'; } if(!k)break; } if(k==0) return 2; else if(k==2) return 0; return 1; } int dfso() { if(threeline('X')) return 0; int k=3; for(int i=0;i<9;++i) { if(s[i]=='#') { s[i]='O'; k=min(k,dfsc()); s[i]='#'; } if(!k) break; } if(k==0) return 2; else if(k==2) return 0; return 1; } void ready() { int x[8]={0,0,1,-1,-1,1,-1,1}; int y[8]={1,-1,0,0,-1,1,1,-1}; for(int i=0;i<3;++i) { for(int j=0;j<3;++j) { int t=i*3+j; int l1,l2; for(int l=0;l<8;++l) { l1=i+x[l]; l2=j+y[l]; if(l1>=0&&l1<3&&l2>=0&&l2<3) mov[t][l]=l1*3+l2; else mov[t][l]=-1; } } } } int main() { //freopen("data.txt","r",stdin); ready(); string stmp; s.clear(); for(int i=0;i<3;++i) { cin>>stmp; s+=stmp; } int k=dfsc(); if(k==0) cout<<"Ouths win"<<endl; else if(k==2) cout<<"Crosses win"<<endl; else cout<<"Draw"<<endl; //system("pause"); return 0; }