EOJ 3260 袋鼠妈妈找孩子 题解

来源:互联网 发布:在线教学软件 编辑:程序博客网 时间:2024/06/10 09:02

题意

袋鼠妈妈找不到她的孩子了。她的孩子被怪兽抓走了。
袋鼠妈妈现在在地图的左上角,她的孩子在地图第 x 行第 y 列的位置。怪兽想和袋鼠妈妈玩一个游戏:他不想让袋鼠妈妈过快地找到她的孩子。袋鼠妈妈每秒钟可以向上下左右四个方向跳一格(如果没有墙阻拦的话),怪兽就要在一些格子中造墙,从而完成一个迷宫,使得袋鼠妈妈能够找到她的孩子,但最快不能小于 k 秒。
请设计这样一个迷宫。

思路

由于数据范围较小,可采取dfs搜索,需要注意的是,每走到一格要求它周围最多有一格被走过(也就是路径的上一步),为保证能搜到全部路径,需要在return前将used记为false

代码

#include <cstdio>char mp[9][9];bool used[9][9],f;int n,m,x,y,k;void dfs(int nowx,int nowy,int step){    int cnt=0;    if(nowx>0)        cnt+=used[nowx-1][nowy];    if(nowx<n-1)        cnt+=used[nowx+1][nowy];    if(nowy>0)        cnt+=used[nowx][nowy-1];    if(nowy<m-1)        cnt+=used[nowx][nowy+1];    if(nowx<0||nowx>=n||nowy<0||nowy>=m||used[nowx][nowy]||cnt>1)        return;    //printf("%d %d %d\n",nowx,nowy,step);    used[nowx][nowy]=true;    if(nowx==x&&nowy==y&&step>=k)    {        mp[nowx][nowy]='.';        f=true;        used[nowx][nowy]=false;        return;    }    dfs(nowx-1,nowy,step+1);    if(f)    {        mp[nowx][nowy]='.';        used[nowx][nowy]=false;        return;    }    dfs(nowx+1,nowy,step+1);    if(f)    {        mp[nowx][nowy]='.';        used[nowx][nowy]=false;        return;    }    dfs(nowx,nowy-1,step+1);    if(f)    {        mp[nowx][nowy]='.';        used[nowx][nowy]=false;        return;    }    dfs(nowx,nowy+1,step+1);    if(f)    {        mp[nowx][nowy]='.';        used[nowx][nowy]=false;        return;    }    used[nowx][nowy]=false;    return;}int main(){    scanf("%d%d",&n,&m);    scanf("%d%d%d",&x,&y,&k);    x--;    y--;    for(int i=0;i<n;i++)        for(int j=0;j<m;j++)            mp[i][j]='*';    dfs(0,0,0);    for(int i=0;i<n;i++)        printf("%s\n",mp[i]);}
0 0
原创粉丝点击