您的位置:首页 > 其它

HDOJ1175连连看搜索

2011-10-02 03:12 316 查看
//本题注意一下两点.

//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");

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: