dfs解救小哈
在《啊哈!算法》中看到了这道题,准备敲敲代码。。。
题意就是 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; }