描述
这有一个迷宫,有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行,每行有四个整数a,b,c,d(0<=a,b,c,d<=8)分别表示起点的行、列,终点的行、列。
输出
- 输出最少走几步。
样例输入
-
2
3 1 5 7
3 1 6 7
样例输出
-
12
11
深搜入门题ORZ。。。因为迷宫0竖着排得多,所以先下再上再右再左。
检测过了的,标记为1,四个方向都检测过,走不通,则恢复为0,再返回上一层。
第一次找到终点后,回到终点前一个点,继续向其他方向搜索。
#include
int c, d, ans, a, b;
void dfs(int m, int n, int step, int vis[][9])
//注意二维数组传递方式
{
if(m == c && n
== d)
{
ans = step;
return;
}
if(step >= ans ||
vis[m][n] == 1)
return;
vis[m][n] = 1;
dfs(m+1, n, step+1,
vis);
dfs(m-1, n, step+1,
vis);
dfs(m, n+1, step+1,
vis);
dfs(m, n-1, step+1,
vis);
vis[m][n] = 0;
//一定要回溯,否则没法第二次第三次的找终点了。无法求出最短路径。(不回溯交叉路口处本可以找路径的就不找了)
}
int main()
{
int n;
scanf("%d",
&n);
while(n--)
{
int vis[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};
ans = 10000;
scanf("%d %d %d %d", &a, &b, &c,
&d);
dfs(a, b, 0, vis);
printf("%d\n", ans);
}
return 0;
}
广搜代码:
#include
#include
#include
#include
using namespace std;
int step, a, b, c, d, dirx[4] = {1, -1, 0, 0}, diry[4] = {0,
0, 1, -1};
typedef struct node
{
int x, y, step;
}node;
int bfs(int x, int y, int m[][9])
{
int i;
queueq;
node u;
u.x = x;
u.y = y;
u.step = 0;
m[x][y] = 1;
q.push(u);
while(!q.empty())
{
//printf("yes\n");
u = q.front();
//printf("%d %d %d\n", u.x, u.y, u.step);
q.pop();
if(u.x == c && u.y == d)
return
u.step;
for(i = 0 ; i < 4 ; i++)
{
node
v;
v.x = u.x
+ dirx[i];
v.y = u.y
+ diry[i];
if(m[v.x][v.y] == 0)
{
//printf("%d %d\n", v.x,
v.y);
m[v.x][v.y] = 1;
v.step = u.step+1;
q.push(v);
}
}
}
return 0;
}
int main()
{
int t;
scanf("%d",
&t);
while(t--)
{
int m[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",
&a,&b,&c,&d);
step = bfs(a, b, m);
printf("%d\n", step);
}
}