码迷,mamicode.com
首页 > 其他好文 > 详细

[CodeForces754B]Ilya and tic-tac-toe game

时间:2018-06-16 22:39:11      阅读:243      评论:0      收藏:0      [点我收藏+]

标签:模拟   枚举   tchar   arch   bre   arc   坐标   size   mem   

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\n");  
    else  
        printf("NO\n");  
        return 0;//啦啦啦
}

[CodeForces754B]Ilya and tic-tac-toe game

标签:模拟   枚举   tchar   arch   bre   arc   坐标   size   mem   

原文地址:https://www.cnblogs.com/lyfoi/p/9191476.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!