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


转载于:https://www.cnblogs.com/brodrinkwater/p/7528033.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值