hdu_1175_BFS+剪枝_用转弯次数来限定
2014-12-15 20:18
239 查看
先贴代码,明天再补上说明
#include<iostream> #include<cstring> #include<algorithm> #include<queue> #include<stdio.h> using namespace std; const int maxn=1000; int map[maxn][maxn],visit[maxn][maxn]; int dir[4][2]={1,0,-1,0,0,1,0,-1}; int n,m; int sx,sy,ex,ey; struct Node { int x,y; int turn; //标示转移方向 }; bool judge(int x,int y) //说明可以进行走动,转向 { return x>=1&&y>=1&&x<=n&&y<=m&&map[x][y]==0; } bool bfs(int x,int y) { //这才是到了关键 queue<Node> q; Node first,next; first.x=x,first.y=y,first.turn=1; //这里用自己的方式标记方向 q.push(first); while(!q.empty()) { first=q.front(); q.pop(); for(int i=0;i<4;i++) { next.x=first.x+dir[i][0]; next.y=first.y+dir[i][1]; if(next.x==ex&&next.y==ey) return true; while(judge(next.x,next.y)) //保证下一点是可以走的 { next.turn=first.turn+1; if(visit[next.x][next.y]==0 && next.turn<4) //只是一个表达式的计算而已 { q.push(next); visit[next.x][next.y]=1; } next.x+=dir[i][0]; next.y+=dir[i][1]; if(next.x==ex&&next.y==ey) return true; } } } return false; } int main(void) { int i,j,k; int query;//查询,这个关键词定义的好 while(cin>>n>>m) { if(n==0&&m==0) break; for(i=1;i<=n;i++) for(j=1;j<=m;j++) cin>>map[i][j]; cin>>query; while(query--) { memset(visit,0,sizeof(visit)); cin>>sx>>sy>>ex>>ey; if(map[sx][sy]==0 || map[ex][ey]==0 || map[sx][sy]!=map[ex][ey]) printf("NO\n"); else printf("%s\n",bfs(sx,sy)?"YES":"NO"); } } }
相关文章推荐
- hdu 1175 连连看(dfs,记录转弯次数)
- 广搜_限制转弯次数[连连看](HDU_1175)
- hdu 1175 连连看dfs(记录转弯次数)
- 广搜_限制转弯次数(HDU_1728)
- HDU 1728--【BFS && 记录转弯次数】
- (hdu step 4.2.7)逃离迷宫(在有转弯次数的限制的情况下,判断一个点是否能到另一个点)
- hdu 1728 迷宫 给定最大转弯次数 (BFS)
- HDU 1728 逃离迷宫(BFS+转弯次数+转弯方向)
- hdu 1175 bfs 转弯题
- hdu 1175 bfs+剪枝
- HDU-1175-连连看BFS+转弯
- 正则表达式:匹配次数限定符
- 连连看 HDU-1175
- hdu 1175 连连看(深搜)
- hdu 5038 求出现次数最多的grade
- HDU 1175 连连看(BFS或DFS)
- HDU 1175 (13.07.08)
- hdu 1175 连连看
- HDU 1175 连连看(DFS)
- HDU 2457 DNA repair 不含模式串的最少修改次数