最少步数
时间限制:
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,10表示道路,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
-
这个题目用了两种方法,深搜广搜都可以做,虽然很水,不过也可以很好的练练搜索
-
#include <stdio.h> #include <string.h> #include <iostream> #include <queue> using namespace std; struct node { int x, y, step; }; int mark[10][10]; int s[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; int maze[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 a, b, c, d; int bfs() { int j, k, i; queue <node> q; struct node no = {a, b, 0}; q.push(no); mark[no.x][no.y] = 1; int flag = 0; while(q.empty() == 0) { no = q.front(); q.pop(); if(no.x == c && no.y == d)//其中注意这里的判断应该放在for外面不然会漏掉起点1 1 1 1的情况 { flag = 1; break ; } for(i = 0; i < 4; i++) { j = no.x + s[i][0]; k = no.y + s[i][1]; if(j >= 0 && j <= 8 && k >= 0 && k <= 8) { if(mark[j][k] == 0 && maze[j][k] == 0) { struct node de = {j, k, no.step + 1}; q.push(de); mark[j][k] = 1; } } } } if(flag == 0)//听组长说bfs一般还是会有返回值的所以我就又加上了,毕竟他是伯乐 return -1; else return no.step; return 0; } int main() { int n, result; scanf("%d", &n); while(n--) { scanf("%d%d%d%d", &a, &b, &c, &d); result = bfs(); if(result == -1) printf("no answer\n"); else printf("%d\n", result); memset(mark, 0, sizeof(mark)); } return 0; }
-
第一行输入一个整数n(0<n<=100),表示有n组测试数据;