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;
}

 

 

 

posted on 2012-10-18 17:43  夜->  阅读(233)  评论(0编辑  收藏  举报