1195. Ouths and Crosses

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;

}

 

 

 

你可能感兴趣的:(out)