HDOJ1175连连看搜索

来源:互联网 发布:葡萄妈家的鞋子知乎 编辑:程序博客网 时间:2024/05/16 02:04
//本题注意一下两点.
//1..中间是除了0以外不能有其他的..包括目标点本身.
//2..对于起点终点权值不同的点,还有起点终点中有为0的点,不用搜索.直接NO,如果没这个就超时了.
//他们的0S怎么搞的..我晕..!!还是Corecoder他们搞的..明儿去问问.
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<math.h>
#include<iostream>
const int inf = 0x3f3f3f;
using namespace std;
int map[1001][1001],vis,row,col,arrx,arry,begx,begy,q,dir[4][2] = { {-1,0},{1,0},{0,1},{0,-1} };
bool judge(int x , int y , int m,int t)
{
    if(x == arrx && y == arry && map[x][y] == m && t <= 2)vis = 1;//这里最开始没有加t<=2,当刚好t=3的时候是错的。
    if(x >= 0 && x < row && y >= 0 && y < col && (map[x][y] == 0) && t <= 2)return true;
    return false ;
}
void dfs(int a , int b , int m , int dirx , int diry , int time)
{
   if(a == arrx && b == arry && map[a][b] == m){vis = 1 ; return;}
   if(vis)return ;
   for(int i = 0 ; i < 4 ; i++)
   {
       int x = dir[i][0] + a ;
       int y = dir[i][1] + b ;
       int n = time ;
       if(dir[i][0] != dirx || dir[i][1] != diry)n++;
       if(judge(x,y,m,n))
       {
           map[a][b] = -map[a][b] - 1 ;
           dfs(x,y,m,dir[i][0],dir[i][1],n);
           map[a][b] = -map[a][b] - 1 ;
       }
   }
}
int main()
{
    while(scanf("%d%d",&row,&col) && row + col != 0)
    {
        memset(map,0,sizeof(map));
        for(int i = 0 ; i< row ; i ++)
        {
            for(int j = 0 ; j < col ; j++)
              scanf("%d",&map[i][j]);
        }
        scanf("%d",&q);
        for(int i = 1 ; i <= q ; i++)
        {
            scanf("%d%d%d%d",&begx,&begy,&arrx,&arry);
            vis = 0;
            begx--;begy--;arrx--;arry--;
            if(!(map[begx][begy] == 0 || map[arrx][arry] == 0 || map[begx][begy] != map[arrx][arry]))
            dfs(begx,begy,map[begx][begy],0,0,-1);
            if(vis)printf("YES\n");
            else printf("NO\n");
        }
    }
}