在一个游戏中,玩家处于一个如下所示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";
}
}