描述:
定义一个二维数组:
int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, };
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。输入:
一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。输出:
左上角到右下角的最短路径,格式如样例所示。样例输入:
0 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0样例输出:
(0, 0) (1, 0) (2, 0) (2, 1) (2, 2) (2, 3) (2, 4) (3, 4) (4, 4)
#include<cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
// 优化dfs
const int N = 10;
int s[N][N];
int walk[N][N];
int ans = 10000;
int dx[4] = {0,1,0,-1}, dy[4] = {1,0,-1,0};
int mx[N],my[N];
int minx[N],miny[N];
void dfs(int x, int y, int sum)
{
mx[sum]=x;
my[sum]=y;
if(x == 4 && y == 4)
{
if(sum < ans)
{
ans = sum;
for(int i=0;i<=sum;i++)
{
minx[i]=mx[i];
miny[i]=my[i];
}
}
return;
}
for(int i = 0; i <= 3; i++)
{
int tx = x + dx[i];
int ty = y + dy[i];
if(tx >= 0 && tx < 5 && ty >= 0 && ty < 5 && walk[tx][ty] > sum + 1 && s[tx][ty] != 1)
{
walk[tx][ty] = sum + 1;
dfs(tx, ty, sum + 1);
}
}
}
int main()
{
memset(walk, 0x3f, sizeof(walk));
for(int i = 0; i < 5; i++)
{
for(int j = 0; j < 5;j++)
{
cin >> s[i][j];
}
}
walk[0][0] = 0;
dfs(0, 0, 0);
for(int i=0;i<=ans;i++)
{
printf("(%d, %d)\n",minx[i],miny[i]);
}
return 0;
}
2022/7/5