nyoj 最少步数(BFS,DFS)
2016-12-09 10:36
363 查看
[align=center]最少步数[/align]
[align=left]原题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=58[/align]
描述
这有一个迷宫,有0~8行和0~8列:
1,1,1,1,1,1,1,1,1
1,0,0,1,0,0,1,0,1
1,0,0,1,1,0,0,0,1
1,0,1,0,1,1,0,1,1
1,0,0,0,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,0,0,0,1
1,1,1,1,1,1,1,1,1
0表示道路,1表示墙。
现在输入一个道路的坐标作为起点,再如输入一个道路的坐标作为终点,问最少走几步才能从起点到达终点?
(注:一步是指从一坐标点走到其上下左右相邻坐标点,如:从(3,1)到(4,1)。)
输入第一行输入一个整数n(0<n<=100),表示有n组测试数据;
随后n行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,终点的行、列。输出输出最少走几步。样例输入
样例输出
代码1(深搜):
代码2(广搜):
ps:这道题用来广搜入门很好,完全理解。。
[align=left]原题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=58[/align]
描述
这有一个迷宫,有0~8行和0~8列:
1,1,1,1,1,1,1,1,1
1,0,0,1,0,0,1,0,1
1,0,0,1,1,0,0,0,1
1,0,1,0,1,1,0,1,1
1,0,0,0,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,1,0,0,1
1,1,0,1,0,0,0,0,1
1,1,1,1,1,1,1,1,1
0表示道路,1表示墙。
现在输入一个道路的坐标作为起点,再如输入一个道路的坐标作为终点,问最少走几步才能从起点到达终点?
(注:一步是指从一坐标点走到其上下左右相邻坐标点,如:从(3,1)到(4,1)。)
输入第一行输入一个整数n(0<n<=100),表示有n组测试数据;
随后n行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,终点的行、列。输出输出最少走几步。样例输入
2 3 1 5 7 3 1 6 7
样例输出
12 11
代码1(深搜):
#include<stdio.h> #include<string.h> #define min(a,b) (a<b?a:b) int vis[9][9]; int c,d,ans,s; int a[9][9]= { 1,1,1,1,1,1,1,1,1, 1,0,0,1,0,0,1,0,1, 1,0,0,1,1,0,0,0,1, 1,0,1,0,1,1,0,1,1, 1,0,0,0,0,1,0,0,1, 1,1,0,1,0,1,0,0,1, 1,1,0,1,0,1,0,0,1, 1,1,0,1,0,0,0,0,1, 1,1,1,1,1,1,1,1,1, }; void dfs(int i,int j,int step) { if(step>s||a[i][j]||vis[i][j]) return ; if(i==c&&j==d) { s=min(step,s); return ; } vis[i][j]=1; dfs(i+1,j,step+1); dfs(i-1,j,step+1); dfs(i,j+1,step+1); dfs(i,j-1,step+1); vis[i][j]=0; } int main() { int n; scanf("%d",&n); while(n--) { memset(vis,0,sizeof(vis)); s=0xffffff; ans=0; int a,b; scanf("%d%d%d%d",&a,&b,&c,&d); dfs(a,b,0); printf("%d\n",s); } return 0; }
代码2(广搜):
#include<stdio.h> #include<string.h> #include<queue> #define min(a,b) (a<b?a:b) using namespace std; int c,d; int to[4][2]= {1,0,-1,0,0,1,0,-1};//方向 bool a[9][9]= { 1,1,1,1,1,1,1,1,1, 1,0,0,1,0,0,1,0,1, 1,0,0,1,1,0,0,0,1, 1,0,1,0,1,1,0,1,1, 1,0,0,0,0,1,0,0,1, 1,1,0,1,0,1,0,0,1, 1,1,0,1,0,1,0,0,1, 1,1,0,1,0,0,0,0,1, 1,1,1,1,1,1,1,1,1, }; struct Node { int x,y,s; } now,next; bool vis[10][10]; int bfs(int m,int n) { queue<Node>w; now.x=m,now.y=n,now.s=0; w.push(now);//初始状态将起点放进队列 vis[m] =1;//标记已经访问过了 int i; while(!w.empty())//队列不为空继续搜索 { now=w.front();//取出队列的头 if(now.x==c&&now.y==d)//找到终点 return now.s; w.pop(); for(i=0; i<4; i++) { int xx=now.x+to[i][0],yy=now.y+to[i][1];//计算相邻节点 if(xx>=0&&yy>=0&&xx<9&&yy<9&&!a[xx][yy]&&!vis[xx][yy])//节点可以走 { vis[xx][yy]=1;//标记已走 next.x=xx,next.y=yy,next.s=now.s+1; w.push(next);//入队 } } } } int main() { int t; scanf("%d",&t); while(t--) { memset(vis,0,sizeof(vis)); int a,b; scanf("%d%d%d%d",&a,&b,&c,&d); printf("%d\n",bfs(a,b)); } return 0; }
ps:这道题用来广搜入门很好,完全理解。。
相关文章推荐
- nyoj 最少步数(BFS,DFS)
- nyoj 最少步数(BFS,DFS)
- nyoj 最少步数(BFS,DFS)
- nyoj 最少步数(BFS,DFS)
- nyoj 最少步数(BFS,DFS)
- 【NYOJ】-最少步数(DFS || BFS&&队列)
- nyoj 最少步数(BFS,DFS)
- nyoj 最少步数(BFS,DFS)
- NYOJ 58 最少步数(dfs或者bfs)
- DFS && BFS 最少步数(nyoj 58)
- 【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)
- nyoj--58--最少步数(bfs&dfs)
- nyoj 最少步数(BFS,DFS)
- nyoj 最少步数(BFS,DFS)
- nyoj 最少步数(BFS,DFS)
- nyoj 最少步数(BFS,DFS)
- nyoj 最少步数(BFS,DFS)
- nyoj 最少步数(BFS,DFS)
- 最少步数(dfs + bfs +bfs优化)
- NYOJ 58 最少步数(BFS)