原题:
在一个游戏中,玩家处于一个如下所示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 a, b, c, d;
//int ans = 0;
int dx[4] = { 0,0,1,-1 };
int dy[4] = { 1,-1,0,0 };
int ans = 10000;
int mapp[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 flag[12][12]; //是否走过
int step = 0;
bool check(int x, int y)
{
// 0 表示道路 ,1表示障碍
if (x >= 0 && y >= 0 && x < 12 && y < 12 && mapp[x][y] == 0 && flag[x][y] == 0)
return true;
return false;
}
void dfs(int x, int y)
{
if (step >= ans)
return;
if (x == c && y == d)
{
ans = step;
return;
}
flag[x][y] = 1;
//四个方向
for (int i = 0; i < 4; i++)
{
if (check(x + dx[i], y + dy[i]) && step<ans)
{
step++;
dfs(x + dx[i], y + dy[i]);
step--;
flag[x][y] = 0;
}
}
int main()
{
//输入玩家的坐标 和 boss坐标
cin >> a >> b >> c >> d;
dfs(a, b);
cout <<ans;
return 0;
}