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;
}
浙公网安备 33010602011771号