C. 袋鼠妈妈找孩子
Time limit per test: 1.5 seconds
Time limit all tests: 10.0 seconds
Memory limit: 256 megabytes
Accept / Submit: 41 / 172
袋鼠妈妈找不到她的孩子了。她的孩子被怪兽抓走了。
袋鼠妈妈现在在地图的左上角,她的孩子在地图第 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
.*.***
......
如果到达了(i,j)
显然 在(i,j)的上下左右 只能有一个点是已经到达过的(就是从该点到达(i,j)的)
加上这条件xjb搜一下 搜索到刚好第k步找到 然后就A了…
#include<stdio.h>
#include <iostream>
#include<stdlib.h>
#include<algorithm>
#include<vector>
#include<deque>
#include<map>
#include<set>
#include<queue>
#include<math.h>
#include<string.h>
#include<string>
using namespace std;
#define ll long long
#define pii pair<int,int>
const int inf = 1e9 + 7;
const int N = 10+5;
bool vis[N][N];
int dirX[]={0,0,-1,1};
int dirY[]={-1,1,0,0};
int n,m;
int x,y,k;
bool flag;
void getAns(){
for(int i=0;i<n;++i){
for(int j=0;j<m;++j){
if(vis[i][j]==1){
putchar('.');
}
else{
putchar('*');
}
}
putchar('\n');
}
}
bool check(int i,int j){
int visNum=0;
for(int d=0;d<4;++d){
int ni=dirX[d]+i;
int nj=dirY[d]+j;
if(ni>=0&&nj>=0&&ni<n&&nj<m){
visNum+=vis[ni][nj];
}
}
return visNum<2;
}
void dfs(int i,int j,int steps){
vis[i][j]=1;
if(flag){
return;
}
if(x==i&&y==j){
if(steps>=k){
flag=1;
getAns();
return;
}
else{
vis[i][j]=0;
return;
}
}
for(int d=0;d<4;++d){
int ni=dirX[d]+i;
int nj=dirY[d]+j;
if(ni>=0&&nj>=0&&ni<n&&nj<m&&vis[ni][nj]==0&&check(ni,nj)){
dfs(ni,nj,steps+1);
}
}
vis[i][j]=0;
}
int main()
{
//freopen("/home/lu/Documents/r.txt","r",stdin);
//freopen("/home/lu/Documents/w.txt","w",stdout);
while(~scanf("%d%d",&n,&m)){
scanf("%d%d%d",&x,&y,&k);
x-=1;
y-=1;
flag=0;
memset(vis,0,sizeof(vis));
dfs(0,0,0);
}
return 0;
}