您的位置:首页 > 其它

HDU 1175 连连看

2012-09-07 10:20 183 查看
#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std;
struct ss
{
int x,y;
int num,di;//di记录上次的方向
}en,st;
int map[1001][1001];
int r[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
int mark[1001][1001];
int n,m,ex,ey,sx,sy;
bool judge(int x,int y)
{
if(x>0&&x<=n&&y>0&&y<=m&&(!map[x][y]||x==ex&&y==ey))
return true;
return false;
}
bool BFS()
{
queue<ss>Q;
Q.push(st);
ss p,s;
int i;
while(!Q.empty())
{
p=Q.front();
Q.pop();
if(p.x==ex&&p.y==ey)return true;
for(i=0;i<4;i++)
{
s=p;
s.x+=r[i][0];
s.y+=r[i][1];
if(s.di==-1){s.di=i;s.num=0;}
else if(s.di!=i){s.num++;s.di=i;}
if(s.num>2)continue;
if(judge(s.x,s.y))
{
if(mark[s.x][s.y]>s.num)
{
Q.push(s);
mark[s.x][s.y]=s.num;
}
}
}
}
return false;
}
int main()
{
int i,j,w;
while(scanf("%d %d",&n,&m),n)
{
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
scanf("%d",&map[i][j]);
scanf("%d",&w);
while(w--&&scanf("%d %d %d %d",&sx,&sy,&ex,&ey))
{
if(map[sx][sy]!=map[ex][ey]||!map[sx][sy]||(sx==ex&&sy==ey))
{
printf("NO\n");
continue;
}
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
mark[i][j]=9999999;
st.x=sx;st.y=sy;
st.di=-1;st.num=0;
if(BFS()) printf("YES\n");
else printf("NO\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: