[CodeForces754B]Ilya and tic-tac-toe game

Posted lyfoi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[CodeForces754B]Ilya and tic-tac-toe game相关的知识,希望对你有一定的参考价值。

Translate

有一个(4*4)的图,先手画(x),后手画(o),谁先满足在对角线或者横线或竖线上有三个连续的标记,则这个人获胜。 问在这个图上画一个(x)标记,是否可以获胜。

思路

直接暴力。暴力模拟,这里我把数组开成8*8就可以尽情的讨论啦,不用考虑数组溢出的问题,只需要讨论你放的这个点是顶点(米字)还是中点(十字)下面是暴力代码。

Code:

#include<iostream>  
#include<cstdio>  
#include<cmath>  
#include<cstring>  
#include<algorithm>  
#include<cstdlib>  
using namespace std;  
const int maxn=8;  
char map[maxn][maxn];  
int v[maxn][maxn];  
bool search(int x,int y)  
{  
    if((v[x-2][y-2]&&v[x-1][y-1])||(v[x-2][y]&&v[x-1][y])||(v[x-2][y+2]&&v[x-1][y+1])||(v[x][y-2]&&v[x][y-1])||(v[x][y+2]&&v[x][y+1])||(v[x+2][y-2]&&v[x+1][y-1])||(v[x+2][y]&&v[x+1][y])||(v[x+2][y+2]&&v[x+1][y+1])||(v[x-1][y]&&v[x+1][y])||(v[x][y-1]&&v[x][y+1])||(v[x-1][y-1]&&v[x+1][y+1])||(v[x-1][y+1]&&v[x+1][y-1])) //暴力核心
        return true;  
    return false;  
}  
int main()  
{  
    memset(v,0,sizeof(v));  
    for(int i=2;i<=5;i++)  //输入并初始化
    {  
        scanf("%s",map[i]+2);  
        for(int j=2;j<=5;j++)  
        {  
            if(map[i][j]=='x')  
                v[i][j]=1;   //把x变成1更好判断一点
        }  
    }  
    bool Q=false;  
    for(int i=2;i<=5;i++)  //枚举放在哪儿
    {  
        for(int j=2;j<=5;j++)  
        {  
            if(map[i][j]=='.'&&search(i,j))  
            {  
                Q=true;  //找到了
                break;  
            }  
        }  
        if(Q)  
            break;  
    }  
    if(Q)  
        cout<<"YES"<<endl;  
    else  
        cout<<"NO"<<endl;  //输出结果
    return 0;  
}

当然也有不是暴力的解法,那就是搜索!主要看代码:

Code

#include<cstdio>  
#include<cstring>  
#include<iostream>  
#include<algorithm>    
using namespace std;  
int fx[8]= {1,-1,0,0,1,-1,1,-1};  
int fy[8]= {0,0,1,-1,1,-1,-1,1};//八个方向  
char map[101][101];  
int flag;  
int dfs()  
{  
    for(int i=1; i<=4; i++)  
    {  
        for(int j=1; j<=4; j++)  
        {  
            if(map[i][j]=='x')//如果遇见了x就看八个方向上有没有满足条件的  
            {  

                for(int k=0; k<8; k++)  
                {  
                    flag=0;  
                    for(int z=1; z<=2; z++)//同一个方向的两个坐标的位置,如果都为x的话,则证明满足条件  
                    {  
                        int fxx=i+fx[k]*z;//fxx,fyy分别表示与x在同一条直线的坐标,  
                        int fyy=j+fy[k]*z;  
                        if(fxx>=1&&fyy<=4&&fyy>=1&&fxx<=4)  
                        {  
                            if(map[fxx][fyy]=='x') continue;  

                            else flag=1;  

                        }  
                        else  
                            flag=1;  
                    }  
                    if(flag==0)//满足条件返回1  
                        return 1;  
                }  
            }  
        }  
    }  
    return 0;  
}  
int main()  
{  

    for(int i=1; i<=4; i++)  //输入
    {  
        for(int j=1; j<=4; j++)  
        {  
            scanf("%c",&map[i][j]);  
        }  
        getchar();  
    }  
    int ok=0;  
    for(int i=1; i<=4; i++)  
    {  
        for(int j=1; j<=4; j++)  
        {  
            if(map[i][j]=='.')  
            {  
                map[i][j]='x';//首先将空白变成x,进行搜索  
                int temp=dfs();  
                map[i][j]='.';//变回原先的数,以免影响下面的数据  
                if(temp==1)//如果等一则证明存在这种情况。  
                {  
                    break;  //成功后跳出 
                }  
            }  
        }  

    }  
    if(ok==1)//输出结果 
        printf("YES
");  
    else  
        printf("NO
");  
        return 0;//啦啦啦
}

以上是关于[CodeForces754B]Ilya and tic-tac-toe game的主要内容,如果未能解决你的问题,请参考以下文章

CodeForces - 754B Ilya and tic-tac-toe game

codeforces 842C Ilya And The Tree

●CodeForces 518D Ilya and Escalator

Codeforces 518D Ilya and Escalator

Ilya And The Tree CodeForces - 842C

C - Ilya And The Tree Codeforces Round #430 (Div. 2)