NYOJ58 最少步数(搜索)
2016-07-13 21:03
288 查看
描述
这有一个迷宫,有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)分别表示起点的行、列,终点的行、列。
输出输出最少走几步。
样例输入
样例输出
拉这个题主要是讨论一点问题。就是关于对于bfs做这个题标记与否,刚开始很容易进入一个误区,那就是和Red and Block 那个题一样,直接对输入的数组进行修改,但是里面存在一个很大的问题,那个题的数据是每运行一次输入一次数据,但是这个是只有一个矩阵,n次输入的结果都是从这一组数据中进行讨论,所以,这个题如果用bfs的话应该标记
这有一个迷宫,有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
样例输出
1211
拉这个题主要是讨论一点问题。就是关于对于bfs做这个题标记与否,刚开始很容易进入一个误区,那就是和Red and Block 那个题一样,直接对输入的数组进行修改,但是里面存在一个很大的问题,那个题的数据是每运行一次输入一次数据,但是这个是只有一个矩阵,n次输入的结果都是从这一组数据中进行讨论,所以,这个题如果用bfs的话应该标记
#include <iostream> #include <algorithm> #include <queue> #include <string.h> using namespace std; struct data { int x; int y; int step; } cur,pre; int dis[4][2] = {{0,1},{1,0},{0,-1},{-1,0}}; int a[10][10] = { {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} }; bool vis[10][10]; int sx,sy,ex,ey; void bfs() { queue<data>que; cur.x = sx; cur.y = sy; cur.step = 0; que.push(cur); vis[sx][sy] = 1; while(!que.empty()) { cur = que.front(); que.pop(); if(cur.x == ex && cur.y == ey) { cout << cur.step << endl; return; } for(int i = 0;i < 4;i ++) { pre = cur; pre.x = pre.x + dis[i][0]; pre.y = pre.y + dis[i][1]; if(pre.x >= 0 && pre.y >= 0 && pre.x < 9 && pre.y < 9 && !a[pre.x][pre.y] && !vis[pre.x][pre.y]) { vis[pre.x][pre.y] = 1; pre.step = pre.step + 1; que.push(pre); } } } } int main() { int t; cin >> t; while(t --) { memset(vis,0,sizeof(vis)); cin >> sx >> sy >> ex >> ey; bfs(); } return 0; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C++的template模板中class与typename关键字的区别分析
- C与C++之间相互调用实例方法讲解