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就好了