在《啊哈!算法》中看到了这道题,准备敲敲代码。。。
题意就是 0可以走,1不能走,输入起点和终点,找到到终点的最小步数。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=51;
int a[maxn][maxn],book[maxn][maxn];//book为标记数组;可以减少搜索量
int move[4][2]={{-1,0},{1,0},{0,-1},{0,1}};//移动数组
int xb,yb,xe,ye,n;
int mi=99999999999;
int i,j,m;
void dfs(int x,int y,int s){//关键的函数,dfs
if(x==xe&&y==ye){//如果找到了,找到最小的步数;
if(s<mi)mi=s;
return;//停止搜索;
}
int tx,ty,k;
for(k=0;k<=3;k++){
tx=x+move[k][0];
ty=y+move[k][1];
if(tx<1||ty>n||tx>n||ty<1)continue;//越界;
if(a[tx][ty]==0&&book[tx][ty]==0){
book[tx][ty]=1;
dfs(tx,ty,s+1);
book[tx][ty]=0;//回溯一步;
}
}
return ;
}
int main(){
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){//存图
for(j=1;j<=m;j++){
scanf("%d",&a[i][j]);
}
}
scanf("%d%d%d%d",&xb,&yb,&xe,&ye);
book[xb][yb]=1;
dfs(xb,yb,0);
printf("%d",mi);
return 0;
}