牛客小白月赛6-E对弈-简单搜索

https://www.nowcoder.com/acm/contest/136/E

我搜索很差啊,看了学长代码,自己在下面手敲了一遍,感觉学长的极其精巧,把我繁琐的搜索步骤给简化了不少

其实本题想法还是很简单的,就是每次放一个物品,我们就搜索他周围的位置,会不会有连续五个,但是我面临的困难是,怎么搜索,有可能我方的棋子在中间,其他4个棋子在两个方向上。

其实很好想啊,我们

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int dx[]={,-,,-,,,-,};
int dy[]={,-,,,-,,,-};
int vis[][];
int n,m;
bool dfs(int x,int y,int z){
vis[x][y]=z;
int xx,yy,cnt;
for (int i=;i<=;i++){
xx=x;
yy=y;
if (i%==){
cnt=;
}
for(int j=;j<=;j++){
xx+=dx[i];
yy+=dy[i];
if (xx< || yy< || xx>n || yy>n || vis[xx][yy]!=z){
break;
}
cnt++;
}
if (cnt>=){
return ;
}
}
return ;
}
int main()
{
while(~scanf("%d%d",&n,&m)){
int x,y;
int flag=-;
memset(vis,-,sizeof(vis));
for (int i=;i<=m;i++){
scanf("%d%d",&x,&y);
if (flag==-){
if (dfs(x,y,i%)){
flag=i;
}
}
}
if (flag==-){
printf("UNK %d\n",m);
}else if (flag%==){
printf("WHZ %d\n",flag);
}else if (flag%==){
printf("HtBest %d\n",flag);
}
}
return ;
}

每次遍历一个方向,但是我是连续搜索两个方向,x%2==1一个方向,x%2==0是上一个方向的反方向,每次搜索连续的相同棋子,当两次后,把cnt初始化为1就好了

上一篇:iOS sqlite3数据库解析


下一篇:【ZOJ 3870】 Team Formation