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;
}


posted @ 2016-08-27 15:17  Drinkwater_cnyali  阅读(169)  评论(0编辑  收藏  举报