[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