/*
Description
每组测试数据以三个整数N,M,T(0<n, m≤20, t>0)开头,分别代表迷宫的长和高,以及公主能坚持的天数。
紧接着有M行,N列字符,由".","*","P","S"组成。其中 "." 代表能够行走的空地。 "*" 代表墙壁,王子不能从此通过。
"P" 是公主所在的位置。 "S" 是王子的起始位置。 每个时间段里王子只能选择“上、下、左、右”任意一方向走一步。
Prototype
int SSaveP (int *maze[], int M, int n, int t)
Input Param
maze 迷宫布局(这里用二维数组实现布局)
M 迷宫(数组)行数
N 迷宫(数组)列数
T 公主能坚持的天数
Output Param
无
Return Value
0 可以救出公主
-1 不可以救出公主
*/
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
char map[22][22];
bool flg;
struct point
{
int x;
int y;
};
point p[4] = {{0, 1},{0, -1},{1, 0},{-1, 0}};
void deep(point S, point P, int t)
{
if(flg)
return;
if (map[S.x][S.y] == 'P')
{
flg = true;
return;
}
if (abs(S.x - P.x) + abs(S.y - P.y) > t)
return;
for (int i = 0; i < 4; i++)
{
if ( map[S.x + p[i].x][S.y + p[i].y] != '*')
{
map[S.x][S.y] = '*';
S.x = S.x + p[i].x;
S.y = S.y + p[i].y;
deep(S, P, t - 1);
S.x = S.x - p[i].x;
S.y = S.y - p[i].y;
map[S.x][S.y] = '.';
}
}
}
int SSavep(char *visited, int t, int n, int m)
{
memset(map, '*', sizeof(char) * 22 * 22);
flg = false;
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
map[i][j] = *visited++;
}
}
point S;
point P;
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
if (map[i][j] == 'S')
{
S.x = i;
S.y = j;
}if (map[i][j] == 'P')
{
P.x = i;
P.y = j;
}
}
}
deep(S, P, t);
if (flg)
return 0;
else
return -1;
}