您的位置:首页 > 其它

HDU 1175 连连看

2013-09-03 19:26 246 查看
转载请注明出处:http://blog.csdn.net/a1dark

分析:这题有点坑、数据有点问题、做不过的就看看别人过了的代码、就会发现要错误的理解才能AC、

这道题可以DFS或者BFS都能轻松过、但是还是要养成剪枝的习惯、

#include <stdio.h>
#include <string.h>
int map[1015][1015];
int vis[1015][1015];
int n,m,x1,x2,y1,y2,flag;
void dfs(int x,int y,int z,int k){
if(flag)
return;
if(k>=3)
return ;
if(x<=0 || y<=0 || x>n || y>m)
return ;
if(x == x2 && y == y2){
flag = 1;
return ;
}
if(k == 2){
if(!(z == 1&& x>x2&& y==y2||z == 2&&x<x2&&y==y2||z ==3&&y>y2&&x==x2||z==4&&y<y2&&x==x2))
return;
}
if(map[x][y]!=0) return;
if(vis[x][y]) return ;
vis[x][y] = 1;
if(z == 1){
dfs(x-1,y,1,k);
dfs(x+1,y,2,k+1);
dfs(x,y-1,3,k+1);
dfs(x,y+1,4,k+1);
}
else if(z == 2){
dfs(x-1,y,1,k+1);
dfs(x+1,y,2,k);
dfs(x,y-1,3,k+1);
dfs(x,y+1,4,k+1);
}
else if(z == 3){
dfs(x-1,y,1,k+1);
dfs(x+1,y,2,k+1);
dfs(x,y-1,3,k);
dfs(x,y+1,4,k+1);
}
else if(z == 4){
dfs(x-1,y,1,k+1);
dfs(x+1,y,2,k+1);
dfs(x,y-1,3,k+1);
dfs(x,y+1,4,k);
}
vis[x][y] = 0;
}
int main(){
while(~scanf("%d%d",&n,&m)){
if(!n&&!m)
break;
int i,j;
for(i = 1; i<=n; i++)
for(j = 1; j<=m; j++)
scanf("%d",&map[i][j]);
int t;
scanf("%d",&t);
while(t--){
flag = 0;
memset(vis,0,sizeof(vis));
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if(x1 == x2 && y1 == y2 && map[x1][y1]!=0)
printf("NO\n");
else if(map[x1][y1] == map[x2][y2] && map[x1][y1]){
dfs(x1-1,y1,1,0);
dfs(x1+1,y1,2,0);
dfs(x1,y1-1,3,0);
dfs(x1,y1+1,4,0);
if(flag)
printf("YES\n");
else
printf("NO\n");
}
else
printf("NO\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  DFS遍历 acm