图论之搜索部分解题思路
2012-09-04 21:03
387 查看
HDU1728:http://acm.hdu.edu.cn/showproblem.php?pid=1728
该题不难,简单的BFS,其复杂的地方就是要找出其最小的转弯次数
该题不难,简单的BFS,其复杂的地方就是要找出其最小的转弯次数
#include<iostream> #include<queue> using namespace std; int Sx,Sy,Ex,Ey,T; int visit[101][101]; int n,m; char Map[101][101]; int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; struct Node { int x; int y; int step; //转弯次数 int dir; }; void BFS(int x,int y) { queue<Node> Q; Node New; New.x=x; New.y=y; New.step=0; New.dir=-1; //构建第一个节点信息 visit[x][y]=0; //无转弯 Q.push(New); while(!Q.empty()) { New=Q.front(); Q.pop(); int u; for(u=0;u<4;u++) { Node top=New; top.x+=dir[u][0]; top.y+=dir[u][1]; if(top.x<1||top.x>n||top.y<1||top.y>m||Map[top.x][top.y]=='*') //越界、越到墙 continue; if(top.dir!=u&&top.dir!=-1) //转弯判定,可推演 top.step++; if(top.step>T) //超出界限,直接跳出,找下一组 continue; if(top.x==Ex&&top.y==Ey) //找到 { cout<<"yes"<<endl; return; } if(visit[top.x][top.y]>=top.step) //记录下转弯数,并入队列 { top.dir=u; visit[top.x][top.y]=top.step; Q.push(top); } } } cout<<"no"<<endl; return; } int main() { int N; while(cin>>N) { while(N--) { cin>>n>>m; memset(Map,0,sizeof(Map)); int i,j; for(i=1;i<=n;i++) for(j=1;j<=m;j++) { cin>>Map[i][j]; visit[i][j]=999; //标记每一个位置的转弯情况 } cin>>T>>Sy>>Sx>>Ey>>Ex; //行列相反 if(Sx==Ex&&Sy==Ey) { cout<<"yes"<<endl; continue; } BFS(Sx,Sy); //传上开始位置 } } return 0; }
相关文章推荐
- HDU 图论之最短路部分解题思路
- leetCode 74.Search a 2D Matrix(搜索二维矩阵) 解题思路和方法
- CCF模拟题部分题目解题思路与AC代码
- leetCode 74.Search a 2D Matrix(搜索二维矩阵) 解题思路和方法
- 部分面试题解题思路
- leetCode 34.Search for a Range (搜索范围) 解题思路和方法
- 第二届360杯全国大学生信息安全技术大赛部分解题思路(WEB安全)
- SecurityOverride Decryption 部分解题思路
- 浙大PAT 1016. 部分A+B (解题思路)
- 解题笔记(2)——部分面试题解题思路 [转]
- 部分acm题目的解题思路(转)
- 第二届360杯全国大学生信息安全技术大赛部分解题思路(数字取证)
- 第二届360杯全国大学生信息安全技术大赛部分解题思路(WEB安全)
- leetCode 34.Search for a Range (搜索范围) 解题思路和方法
- 算法学习笔记(2)——部分面试题解题思路
- leetCode 79.Word Search (词搜索) 解题思路和方法
- 第二届360杯全国大学生信息安全技术大赛部分解题思路(加密解密题)
- 第二届360杯全国大学生信息安全技术大赛部分解题思路(逆向分析)
- 第二届360杯全国大学生信息安全技术大赛部分解题思路(数字取证)
- 浙大PAT 4-06. 搜索树判断 (解题思路)