nyoj-58 最少步数
来源:互联网 发布:投资软件靠谱吗 编辑:程序博客网 时间:2024/05/18 00:13
最少步数
时间限制:3000 ms | 内存限制:65535 KB 难度:4
描述
这有一个迷宫,有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
wa了次 有点伤心 忘记走过要标记为1了 导致 内存超限
上代码:
bfs
#include <iostream>#include <cstdio>#include <algorithm>#include <queue>#include <math.h>using namespace std;int cx[4][2] = {0,1,0,-1,1,0,-1,0}; //上下左右4个方向int x,y,x2,y2;struct node{ int x,y; int step;} now; //now代表当前位置void bfs(int a[9][9]){ node next; //next代表下一位置 queue<node>q; //建立优先队列 q.push(now); while (!q.empty()) { now = q.front(); q.pop(); if (now.x == x2&&now.y == y2) //如果起点和终点相同 输出 { printf("%d\n",now.step); return; } for (int i=0; i<4; i++) //上下左右4个方向 { next.x = now.x+cx[i][0]; next.y = now.y+cx[i][1]; next.step = now.step+1; if (next.x>=0&&next.x<9&&next.y>=0&&next.y<9&&a[next.x][next.y]!=1) //满足规定条件 { if (next.x == x2&&next.y == y2) //当走到规定位置输出 { printf("%d\n",next.step); return; } next.step = now.step+1; //否则步数加1 a[next.x][next.y]=1; //走过的位置标记为 不能走 的状态 q.push(next); } } }}int main(){ int n; scanf("%d",&n); for (int i=0; i<n; i++) { 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 }; scanf("%d%d%d%d",&x, &y, &x2, &y2); now.x= x; now.y = y; now.step = 0; bfs(a); } return 0;}
dfs
#include <iostream>#include <cstdio>#include <algorithm>#include <queue>#include <math.h>using namespace std;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 };int cx[4][2] = {0,1,0,-1,1,0,-1,0}; //上下左右4个方向int Min;int x,y,x2,y2;void dfs(int i,int j,int sum){ int k; if (i==x2&&j==y2) { if (sum<Min) Min = sum; return; } for (k=0; k<4; k++) { int x1 = i+cx[k][0]; int y1 = j+cx[k][1]; if (a[x1][y1]==0) { a[x1][y1]=1; dfs(x1,y1,sum+1); a[x1][y1]=0; } }}int main(){ int n; scanf("%d",&n); for (int i=0; i<n; i++) { Min=999; scanf("%d%d%d%d",&x, &y, &x2, &y2); a[x][y]=1; dfs(x,y,0); a[x][y]=0; cout<<Min<<endl; } return 0;}
阅读全文
0 0
- NYOJ 58 最少步数
- NYOJ-58:最少步数
- NYOJ 58 最少步数
- nyoj-58-最少步数
- nyoj 58-最少步数
- nyoj 58最少步数
- NYOJ 58 最少步数
- nyoj-58-最少步数
- NYoj 58 最少步数
- NYOJ 58 最少步数
- NYOJ-58 最少步数
- NYOJ 58 最少步数
- NYOJ 58 最少步数
- nyoj 58 最少步数
- nyoj 58 最少步数
- nyoj--58--最少步数
- nyoj--58 最少步数
- nyoj 58 最少步数
- java基于StringBuilder自己实现myArrayList
- 对SSH(Struct、Spring、Hibernate)框架的理解
- Java后台之路(19)-MyBatis之xml配置
- VINS ---初始化
- 二叉搜索树详解链式与数组式实现
- nyoj-58 最少步数
- JSTL核心标签库中的用法
- 转载-Android运行时异常“Binary XML file line # : Error inflating class”
- Kubernetes 核心原理 之一
- <machine learning traning> KNN
- java list对元素进行指定多个字段属性按多种排序方式进行排序
- C++ 调用打印机 打印一段文字
- 不错的递归题:输入123,返回“321”。 要求必须用递归,不能用全局变量,输入必须是一个参数,必须返回字符串。
- 1css基本语法