您的位置:首页 > 其它

hdu 1175 连连看

2011-07-30 09:33 197 查看
/*
广搜记录到这点拐了几个弯
*/
#include<stdio.h>
#include<queue>
using namespace std;
struct node
{
int x,y;
};
int dir[4][2]={-1,0,  0,-1,  1,0,  0,1};
int n,m,num,sx,sy,ex,ey;
int map[1100][1100];
struct
{
int qx,qy,bu,ping,shu;
}vis[1100][1100];//记录数组,vis[][].ping记录从水平方向到这点拐的弯数,vis[][].shu是竖直方向上的,
//vis[][].bu步数,用于判断是否第一次访问,qx和qy好像没用到
void bfs()
{
node cur,next;
int i;
queue<node>q;
cur.x=sx,cur.y=sy;
memset(vis,-1,sizeof(vis));
q.push(cur);
vis[cur.x][cur.y].bu=1;
vis[cur.x][cur.y].ping=0;
vis[cur.x][cur.y].shu=0;
vis[cur.x][cur.y].qx=1;//其实没用
vis[cur.x][cur.y].qy=1;//其实没用
while(!q.empty())
{
cur=q.front();
q.pop();
for(i=0;i<4;i++)
{
next.x=cur.x+dir[i][0];
next.y=cur.y+dir[i][1];
if(next.x>=1&&next.x<=n&&next.y>=1&&next.y<=m)//若在空间内
{
if(map[next.x][next.y]==0||(next.x==ex&&next.y==ey))//是路或者是终点
{
if(vis[next.x][next.y].bu==-1)//第一次访问
{
vis[next.x][next.y].bu=vis[cur.x][cur.y].bu+1;
q.push(next);
}
int aa=1000000,bb=1000000;
if(next.x==cur.x)//从水平方向到这儿,其.ping可能要变
{
if(vis[cur.x][cur.y].ping!=-1)//若其前一节点的.ping有值,即前一节点可以通过前前一节点水平得到
aa=vis[cur.x][cur.y].ping;//故,可以直线到当前节点,其.ping同前一节点
if(vis[cur.x][cur.y].shu!=-1)//前一节点可通过与前一节点竖直的节点得到
bb=vis[cur.x][cur.y].shu+1;//在前一节点产生一个弯,当前节点不前一节点大一
if(aa>bb)//找到最小的
aa=bb;
if(vis[next.x][next.y].ping==-1)//.ping无值
{
vis[next.x][next.y].ping=aa;//赋值
if(aa<vis[next.x][next.y].shu)//比竖直方向上的小
q.push(next);//再次入队
}
else if(aa<vis[next.x][next.y].ping)//.ping有值且aa<该值
{
vis[next.x][next.y].ping=aa;//更新
q.push(next);//再次入队
}
}
else//从竖直方向到这儿,其.shu可能要变,下边同理
{
if(vis[cur.x][cur.y].ping!=-1)
aa=vis[cur.x][cur.y].ping+1;
if(vis[cur.x][cur.y].shu!=-1)
bb=vis[cur.x][cur.y].shu;
if(aa>bb)
aa=bb;
if(vis[next.x][next.y].shu==-1)
{
vis[next.x][next.y].shu=aa;
if(aa<vis[next.x][next.y].ping)
q.push(next);
}
else if(aa<vis[next.x][next.y].shu)
{
vis[next.x][next.y].shu=aa;
q.push(next);
}
}

if(next.x==ex&&next.y==ey&&//是终点且
(vis[next.x][next.y].ping>=0&&vis[next.x][next.y].ping<=2//.ping符合条件或
||vis[next.x][next.y].shu>=0&&vis[next.x][next.y].shu<=2))//.shu符合条件
return;
}
}
}
}
}
int main()
{
int i,j;
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",&num);
while(num--)
{
scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
if(map[sx][sy]==0||map[ex][ey]==0)//是路
{
printf("NO\n");
continue;
}
if(map[ex][ey]!=map[sx][sy])//不是同一类型
{
printf("NO\n");
continue;
}
if(sx==ex&&sy==ey)//同一个点
{
printf("NO\n");
continue;
}
bfs();
if(vis[ex][ey].bu==-1)//访问不到
printf("NO\n");
else if(vis[ex][ey].ping>=0&&vis[ex][ey].ping<=2||vis[ex][ey].shu>=0&&vis[ex][ey].shu<=2)//若至少有一个0<=拐弯<=2
printf("YES\n");
else printf("NO\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struct