题目描述:
袋鼠妈妈找不到她的孩子了。她的孩子被怪兽抓走了。
袋鼠妈妈现在在地图的左上角,她的孩子在地图第 行第 列的位置。怪兽想和袋鼠妈妈玩一个游戏:他不想让袋鼠妈妈过快地找到她的孩子。袋鼠妈妈每秒钟可以向上下左右四个方向跳一格(如果没有墙阻拦的话),怪兽就要在一些格子中造墙,从而完成一个迷宫,使得袋鼠妈妈能够找到她的孩子,但最快不能小于 秒。
请设计这样一个迷宫。
Input
第一行两个整数 ,表示地图的总行数和总列数。
第二行三个整数 。
Output
输出一个地图,应正好 行 列。
用 . 表示空地,用 * 表示墙。袋鼠妈妈所在的位置和孩子所在的位置用 . 表示。
数据保证有解。
Examples
Input
2 6
1 3 4
Output
.*.***
......
Source
2017 华东师范大学网赛
题解:
DFS搜索一遍就ok了。需要注意的是避免绕路的情况,保证两点间最短距离>=k,判断一个点可不可以走除了这个点没走过以及这个点在n*m地图中外,还有这个点上下左右已走过的点的数量<2,很有意思的一道题目。
CODE:
#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,k,vis[9][9];
char g[11][11];
int go[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
int check(int a,int b)
{
if(a>=0&&a<n&&b>=0&&b<m) return 1;
return 0;
}
int dfs(int a,int b,int num)
{
int t=0;
for(int i=0;i<4;i++){
int nx=a+go[i][0],ny=b+go[i][1];
if(check(nx,ny))
t+=vis[nx][ny];
}
if(t>=2) return 0;
if(a==x&&b==y){
if(num>=k) return 1;
return 0;
}
for(int i=0;i<4;i++){
int nx=a+go[i][0];
int ny=b+go[i][1];
if(nx>=0&&nx<n&&ny>=0&&ny<m&&!vis[nx][ny]){
vis[nx][ny]=1;
g[nx][ny]='.';
if(dfs(nx,ny,num+1)) return 1;
g[nx][ny]='*';
vis[nx][ny]=0;
}
}
return 0;
}
int main()
{
while(~scanf("%d%d%d%d%d",&n,&m,&x,&y,&k)){
memset(g,'*',sizeof(g));
memset(vis,0,sizeof(vis));
vis[0][0]=1;
g[0][0]='.';
x--;y--;
dfs(0,0,0);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++) printf("%c",g[i][j]);
puts("");
}
}
return 0;
}