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; }
相关文章推荐
- hdu 1175 连连看 (DFS)
- hdu 1175 连连看 DFS解法。用来入门DFS是不错的
- 【HDU 1175 连连看】 + DFS + 减枝
- HDU 1175 连连看 (BFS带方向的判定)
- HDU 1175 连连看(BFS)
- hdu(1175)连连看
- hdu1175——连连看
- hdu 1175 连连看 (简单DFS)
- HDU-1175 连连看 BFS
- hdu 1175 连连看
- hdu 1175 连连看 DFS+剪枝
- HDU 1175 连连看
- hdu 1175 连连看
- HDU 1175 连连看 (BFS)
- HDU 1175 连连看(广搜)
- hdu 1175 [连连看] dfs搜索
- hdu 1175 连连看
- hdu 1175 连连看 (BFS)
- HDU-1175-连连看
- hdu 1175 连连看(dfs,记录转弯次数)