From:http://acm.hdu.edu.cn/showproblem.php?pid=1175

题意:0为空,数字1~n代表不同的棋子,给出一个棋盘和q对两个棋子的坐标(x1,y1)、(x2,y2),问能否消除。

思路:BFS向一个方向搜,若搜不到则转向,若能在转向次数<=2时搜到,则YES,反之NO。

#include <bits/stdc++.h>

using namespace std;

int n,m;
int maze[1050][1050];
int dr[4]={1,0,-1,0};
int dc[4]={0,1,0,-1};
int vis[1050][1050];
int ok;
struct node{
    int x,y,cnt;
}st,ed;


void bfs()
{
    queue <node> q;
    st.cnt=-1;//这种写法会导致转向次数初始为1,需-1
    q.push(st);
    node tmp;
    while(!q.empty())
    {
        tmp=q.front();
        vis[tmp.x][tmp.y]=1;
        q.pop();
        
        for(int i=0;i<4;i++)
        {
             node nxt;
             nxt.x=tmp.x+dr[i];
             nxt.y=tmp.y+dc[i];
//下面这个while与之前做的多向同找不同,需先往一个方向找至尽头,若找不到,则转向+1并转向
             while(nxt.x>=0&&nxt.x<n&&nxt.y>=0&&nxt.y<m&&(maze[nxt.x][nxt.y]==0||(nxt.x==ed.x&&nxt.y==ed.y)))
             {
                  if(!vis[nxt.x][nxt.y]){
                  nxt.cnt=tmp.cnt+1;//此tmp.cnt为上面定义的上次的cnt,比如上次的cnt是0,此次就是1,然后入队,直到再用此队列元素时,这个元素是已经转过一次向的
                  vis[nxt.x][nxt.y]=1;
                  q.push(nxt);
                  if(nxt.x==ed.x&&nxt.y==ed.y&&nxt.cnt<=2)
                  {
                        ok=1;
                        return ;
                  }
                  }
                  nxt.x+=dr[i],nxt.y+=dc[i];//在此方向上往深处找
             }
        }
     }
}


int main()
{
    while(scanf("%d%d",&n,&m)!=EOF&&n+m){
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            cin>>maze[i][j];
        }
    }
    int q;
    scanf("%d",&q);
    while(q--!=0)
    {

        scanf("%d%d%d%d",&st.x,&st.y,&ed.x,&ed.y);
        ok=0;
        memset(vis,0,sizeof(vis));
        st.x--,st.y--,ed.x--,ed.y--;//此处是棋盘按0~n-1读入的
        if(maze[st.x][st.y]!=maze[ed.x][ed.y])//剪枝
        {
            printf("NO\n");
            continue;
        }
        if(maze[st.x][st.y]==0||maze[ed.x][ed.y]==0||(st.x==ed.x&&st.y==ed.y))//剪枝
        {
            printf("NO\n");
            continue;
        }
       // printf("x1:%d y1:%d x2:%d y2:%d\n",x1,y1,x2,y2);
        bfs();
       if(ok) printf("YES\n");
       else printf("NO\n");
    }
    }
    return 0;
}