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");
}
}
}
//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");
}
}
}
相关文章推荐
- HDOJ 1175 连连看 广度优先搜索
- HDU 1175 连连看 (搜索,dfs)
- hdu 1175 [连连看] dfs搜索
- hdu 1175 连连看(搜索)
- hdoj 1175 连连看(dfs+剪枝)
- hdoj 1175-连连看
- 【暴力搜索】[HDU 1175]连连看
- hdoj1175 连连看
- hdoj-【1175 连连看】
- 【HDOJ】1175 连连看
- HDOJ1175 连连看(bfs)
- hdoj--1175 连连看(dfs)
- HDOJ1175连连看的解题报告
- HDOJ 1175连连看 (DFS)
- HDOJ1175 连连看(dfs)
- HDU 1175 连连看 (搜索 DFS)
- HDOJ1175 连连看
- HDOJ 1175 连连看 (bfs)
- HDOJ 1175 连连看(DFS)
- 【搜索之BFS + 剪枝】杭电 hdu 1175 连连看