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");
}
}
}
//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");
}
}
}
- HDOJ1175连连看搜索
- HDOJ1175连连看
- HDOJ1175 连连看
- HDOJ1175 连连看(bfs)
- HDOJ1175 连连看(dfs)
- HDOJ1175连连看 DFS
- HDOJ1175 连连看
- hdoj1175 连连看
- HDOJ1175连连看
- HDOJ1175连连看的解题报告
- hdu1175 连连看 搜索
- 【搜索】[HDU1175]连连看
- HDU1175 连连看 模拟搜索
- 广度优先搜索-连连看
- HDU1175连连看【搜索】【剪枝】
- ACM 搜索 hdu1175 连连看
- 连连看 1175 HDU(广度搜索)
- hdu 1175 [连连看] dfs搜索
- hdu 1028Ignatius and the Princess III(整数划分)
- SQLite, C#, 安装, 配置, 测试
- svn架设的一部分经验
- Linux操作系统下/etc/hosts文件配置方法
- MATLAB图像处理相关函数
- HDOJ1175连连看搜索
- eclipse 将android项目打包成签名的apk文件
- 学习博客
- 数字组合
- Notification返回到当前正在运行的Activity
- VNC与Xmanager等远程工具。
- XP,Ubuntu 10.04 双系统GRUB恢复
- RS485的施工建议
- 当你发现这些你有了,说明你开始成熟了