题目描述
迷宫由n行m列的单元格组成(n<50,m<50),每个单元格不是空地(空地为1)要么就是障碍物(障碍物为2) ,现在请你找出一条从起点到终点的最短路径的步数;
输入样例:
5 4
1 1 2 1
1 1 1 1
1 1 2 1
1 2 1 1
1 1 1 2
1 1 4 3
输出样例:
7
#include<iostream>
using namespace std;
int a[100][100],v[100][100];
int p,q,m,n,mini=99999999;
void fps(int x,int y,int step)//运用到了递归
{
if(x==p&&y==q)//p,q为终点坐标
{
if(step<mini)//不断找最小值步数
mini=step;
return;
}
if(a[x][y+1]==1&&v[x][y+1]==0){//向右移
v[x][y+1]=1;
fps(x,y+1,step+1);
v[x][y+1]=0;
}
if(a[x+1][y]==1&&v[x+1][y]==0){//向下移
v[x+1][y]=1;
fps(x+1,y,step+1);
v[x+1][y]=0;
}
if(a[x][y-1]==1&&v[x][y-1]==0){//向左移
v[x][y-1]=1;
fps(x,y-1,step+1);
v[x][y-1]=0;
}
if(a[x-1][y]==1&&v[x-1][y]==0){//向上移
v[x-1][y]=1;
fps(x-1,y,step+1);
v[x-1][y]=0;
}
return;
}
int main()
{
int sx,sy;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
}
}
scanf("%d%d%d%d",&sx,&sy,&p,&q);
v[sx][sy]=1;
fps(sx,sy,0);
printf("%d",mini);
}
第二种方法:
#include<iostream>
using namespace std;
int a[100][100],v[100][100];
int p,q,m,n,mini=9999;
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
void fps(int x,int y,int step)
{
if(x==p&&y==q)//p,q为终点坐标
{
if(step<mini)
mini=step;
return;
}
for(int k=0;k<=3;k++)
{
int px,py;
px=x+dx[k];
py=y+dy[k];
if(a[px][py]==1&&v[px][py]==0)
{
v[px][py]=1;
fps(px,py,step+1);
v[px][py]=0;
}
}
return;
}
int main()
{
int sx,sy;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
}
}
scanf("%d%d%d%d",&sx,&sy,&p,&q);
v[sx][sy]=1;
fps(sx,sy,0);
printf("%d",mini);
}
C++代码:
#include<iostream>
using namespace std;
int a[80][80], v[80][80];
int yand[4] = { 1,0,-1,0 };
int xand[4] = { 0,1,0,-1 };
int m, n, endx, endy,minum = 9999999;
void dfs(int x, int y, int step) {
if (x == endx && y == endy) {
if (step < minum) {
minum = step;
}
return;
}
for (int i = 0; i <= 3; i++) {
int tx,ty;
tx = x + xand[i];
ty = y + yand[i];
if (a[tx][ty] == 1 && v[tx][ty] == 0) {
v[tx][ty] = 1;
dfs(tx, ty, step + 1);
v[tx][ty] = 0;
}
}
return;
}
int main()
{
int startx, starty, x, y, z;
cin >> x >> y;
for (int i = 1; i <= x; i++) {
for (int j = 1; j <= y; j++) {
cin >> a[i][j];
}
}
cin >> startx >> starty >> endx >> endy;
v[startx][starty] = 1;
dfs(startx, starty, 0);
cout << minum;
return 0;
}