牛客小白月赛6-E对弈-简单搜索
https://www.nowcoder.com/acm/contest/136/E
我搜索很差啊,看了学长代码,自己在下面手敲了一遍,感觉学长的极其精巧,把我繁琐的搜索步骤给简化了不少
其实本题想法还是很简单的,就是每次放一个物品,我们就搜索他周围的位置,会不会有连续五个,但是我面临的困难是,怎么搜索,有可能我方的棋子在中间,其他4个棋子在两个方向上。
其实很好想啊,我们
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; int dx[10]={1,-1,1,-1,0,0,-1,1}; int dy[10]={1,-1,0,0,-1,1,1,-1}; int vis[1004][1004]; int n,m; bool dfs(int x,int y,int z){ vis[x][y]=z; int xx,yy,cnt; for (int i=0;i<=7;i++){ xx=x; yy=y; if (i%2==0){ cnt=1; } for(int j=0;j<=3;j++){ xx+=dx[i]; yy+=dy[i]; if (xx<1 || yy<1 || xx>n || yy>n || vis[xx][yy]!=z){ break; } cnt++; } if (cnt>=5){ return 1; } } return 0; } int main() { while(~scanf("%d%d",&n,&m)){ int x,y; int flag=-1; memset(vis,-1,sizeof(vis)); for (int i=1;i<=m;i++){ scanf("%d%d",&x,&y); if (flag==-1){ if (dfs(x,y,i%2)){ flag=i; } } } if (flag==-1){ printf("UNK %d\n",m); }else if (flag%2==0){ printf("WHZ %d\n",flag); }else if (flag%2==1){ printf("HtBest %d\n",flag); } } return 0; }
每次遍历一个方向,但是我是连续搜索两个方向,x%2==1一个方向,x%2==0是上一个方向的反方向,每次搜索连续的相同棋子,当两次后,把cnt初始化为1就好了