首页 > 代码库 > HDU-1175-连连看
HDU-1175-连连看
题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=1175
普通的bfs,外加判断转角次数,就ko了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct node
{
int x,y;
int t,d;
};
int n,m,map[1002][1002],prove;
int visit[1002][1002];
int qry,sx,sy,ex,ey;
int dx[4]={0,-1,0,1};
int dy[4]={1,0,-1,0};
queue<node> q;
void bfs()
{
while(!q.empty())
q.pop();
memset(visit,0,sizeof(visit));
node s,e;
s.x=sx; s.y=sy;
s.t=0; s.d=-1;
q.push(s);
while(q.size())
{
s=q.front();
q.pop();
if(s.t>2)
continue;
if(s.x==ex&&s.y==ey)
{
prove=1;
printf("YES\n");
break;
}
for(int i=0;i<4;i++)
{
e.x=s.x+dx[i]; e.y=s.y+dy[i];
if(e.x<1||e.x>n||e.y<1||e.y>m||visit[e.x][e.y])
continue;
if(map[e.x][e.y]==0||(e.x==ex&&e.y==ey))
{
if(s.d==-1||s.d==i)
{
e.d=i;
e.t=s.t;
q.push(e);
visit[e.x][e.y]=1;
}
else
{
e.d=i;
e.t=s.t+1;
q.push(e);
visit[e.x][e.y]=1;
}
}
}
}
}
int main(void)
{
while(scanf("%d%d",&n,&m)==2&&(n+m))
{
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&map[i][j]);
scanf("%d",&qry);
for(int i=0;i<qry;i++)
{
prove=0;
cin>>sx>>sy>>ex>>ey;
if(sx==ex&&sy==ey)
{
printf("NO\n");
continue;
}
if(map[sx][sy]==map[ex][ey]&&map[sx][sy]!=0)
bfs();
if(!prove)
printf("NO\n");
}
}
return 0;
}
HDU-1175-连连看
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。