C. 袋鼠妈妈找孩子

来源:互联网 发布:mysql不能输入中文 编辑:程序博客网 时间:2024/04/29 03:35
C. 袋鼠妈妈找孩子Time limit per test: 1.5 secondsTime limit all tests: 10.0 secondsMemory limit: 256 megabytesAccept / 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 列。用 . 表示空地,用 * 表示墙。袋鼠妈妈所在的位置和孩子所在的位置用 . 表示。数据保证有解。Examplesinput2 61 3 4output.*.***......

如果到达了(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;}