袋鼠妈妈找孩子
Time limit per test: 1.5 seconds
Time limit all tests: 10.0 seconds
Memory limit: 256 megabytes
袋鼠妈妈找不到她的孩子了。她的孩子被怪兽抓走了。
袋鼠妈妈现在在地图的左上角,她的孩子在地图第 x 行第 y 列的位置。怪兽想和袋鼠妈妈玩一个游戏:他不想让袋鼠妈妈过快地找到她的孩子。袋鼠妈妈每秒钟可以向上下左右四个方向跳一格(如果没有墙阻拦的话),怪兽就要在一些格子中造墙,从而完成一个迷宫,使得袋鼠妈妈能够找到她的孩子,但最快不能小于 k 秒。
请设计这样一个迷宫。
Input
第一行两个整数 n,m (1≤n,m≤8) ,表示地图的总行数和总列数。
第二行三个整数 x,y,k (1≤x≤n,1≤y≤m,x+y>1) 。
Output
输出一个地图,应正好 n 行 m 列。
用 .
表示空地,用 *
表示墙。袋鼠妈妈所在的位置和孩子所在的位置用 .
表示。
数据保证有解。
Examples
input
2 6 1 3 4
output
.*.*** ......
dfs在中间过程就对路径周围的路进行封锁保证当前路径为最短路
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1007;
const int inf = 0x3f3f3f3f;
const int mod = 10007;
char str[10][10];
int n, m;
int ex, ey, k;
int flag;
int dir[4][2]= {{-1,0},{1,0},{0,-1},{0,1}};
struct node
{
int x, y;
};
void dfs(int x,int y,int prex,int prey,int step)
{
node p[10];
if(flag) return ;
int cnt=0;
for(int i=0; i<4; i++)
{
int ax=x+dir[i][0], ay=y+dir[i][1];
if(ax<1||ax>n||ay<1||ay>m||str[ax][ay]=='*') continue;
if(ax==prex&&ay==prey) continue;
if(ax==ex&&ay==ey)
{
if(step+1>=k) flag=1;
return ;
}
p[cnt].x=ax,p[cnt].y=ay;
cnt++;
}
if(cnt==3)
{
str[p[0].x][p[0].y]='*',str[p[1].x][p[1].y]='*';
dfs(p[2].x,p[2].y,x,y,step+1);
if(flag) return ;
str[p[1].x][p[1].y]='.',str[p[2].x][p[2].y]='*';
dfs(p[1].x,p[1].y,x,y,step+1);
if(flag) return ;
str[p[0].x][p[0].y]='.',str[p[1].x][p[1].y]='*';
dfs(p[0].x,p[0].y,x,y,step+1);
if(flag) return ;
str[p[1].x][p[1].y]='.',str[p[2].x][p[2].y]='.';
}
else if(cnt==2)
{
str[p[0].x][p[0].y]='*';
dfs(p[1].x,p[1].y,x,y,step+1);
if(flag) return ;
str[p[0].x][p[0].y]='.',str[p[1].x][p[1].y]='*';
dfs(p[0].x,p[0].y,x,y,step+1);
if(flag) return ;
str[p[1].x][p[1].y]='.';
}
else if(cnt==1) dfs(p[0].x,p[0].y,x,y,step+1);
return ;
}
int main()
{
scanf("%d %d", &n, &m);
scanf("%d %d %d", &ex, &ey, &k);
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
str[i][j]='.';
flag=0;
dfs(1,1,0,0,0);
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
printf("%c",str[i][j]);
printf("\n");
}
return 0;
}