7-15 最近距离

在一个游戏中,玩家处于一个如下所示12行12列的迷宫:

0,1,0,0,0,1,1,1,0,1,0,1

0,0,0,1,0,0,0,0,1,0,0,1

0,1,0,1,0,1,1,1,0,1,0,0

0,1,0,0,0,0,0,1,0,0,1,1

0,0,0,0,1,0,0,0,0,0,0,0

0,0,1,0,0,0,1,0,0,0,1,0

0,0,1,0,0,0,0,0,1,0,0,0

1,0,0,1,0,1,0,0,0,1,0,1

0,0,1,0,1,0,1,0,1,0,0,0

0,0,0,0,0,1,0,0,0,1,1,0

0,0,0,0,0,1,0,0,0,0,0,0

0,1,0,1,0,0,0,1,0,1,0,0

其中迷宫由0,1组成,0表示道路,1表示障碍物。

现在要根据玩家和游戏中被攻击的虚拟boss所在位置,给玩家以最近距离的提示。

最近距离:即玩家走到boss所走的最少步数。(注:路线中的一步是指从一个坐标点走到其上下左右相邻坐标点。)

输入格式:

输入4个整数a,b,c,d(即玩家和虚拟boss在迷宫中的坐标位置分别为(a,b) 、(c,d)),
其中 0<=a,b,c,d<12。

输出格式:

输出在迷宫中从(a,b)出发到达(c,d)的最少步数,如果(a,b)永远无法到达(c,d)则输出10000。

输入样例:

在这里给出一组输入。例如:

0 0 11 11

输出样例:

在这里给出相应的输出。例如:

22

代码如下: 

#include<bits/stdc++.h>
using namespace std;

//初始化地图 
int Map[12][12] = {
0,1,0,0,0,1,1,1,0,1,0,1,

0,0,0,1,0,0,0,0,1,0,0,1,

0,1,0,1,0,1,1,1,0,1,0,0,

0,1,0,0,0,0,0,1,0,0,1,1,

0,0,0,0,1,0,0,0,0,0,0,0,

0,0,1,0,0,0,1,0,0,0,1,0,

0,0,1,0,0,0,0,0,1,0,0,0,

1,0,0,1,0,1,0,0,0,1,0,1,

0,0,1,0,1,0,1,0,1,0,0,0,

0,0,0,0,0,1,0,0,0,1,1,0,

0,0,0,0,0,1,0,0,0,0,0,0,

0,1,0,1,0,0,0,1,0,1,0,0
};
int vis[12][12] = {0};
int dx[4] = {0,0,1,-1};//x的移动方向 
int dy[4] = {1,-1,0,0};//y的移动方向 
int a,b,c,d,flag = 0,cnt = 0,Min = 99999;

//用一个函数来判断一个走向是否合理 
bool isValid(int x,int y){
	//x和y都在地图范围内,该位置上是道路不是障碍,且该位置未访问过 
	return x>=0&&x<12&&y>=0&&y<12&&Map[x][y]==0&&!vis[x][y];
}
void dfs(int x,int y){
	if(x==c&&y==d){
		if(cnt<Min){
			Min = cnt;
		}
		flag = 1;   //能达到目标位置,标记一下 
	}
	vis[x][y] = 1;    //到达一个位置后,先标记一下以免重复访问 
	cnt++;    //到了一个位置,步数增加 
	for(int i = 0;i<4;i++){
		int nextx = x+dx[i];
		int nexty = y+dy[i];
		if(isValid(nextx,nexty)){
			dfs(nextx,nexty);
			cnt--;  //走不通就回到上一个位置,步数减少 
		}
	}
	vis[x][y] = 0;//重置该位置的标记 
	
}
int main(){
	cin>>a>>b>>c>>d;
	dfs(a,b);
	if(flag==1){   //能到达目标位置就输出步数 
		cout<<Min;
	}else{         //到不了目标位置就输出10000 
		cout<<"10000";
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值