思路:刚开始以为直接dfs搜索到终点就可以了。我是刚开始将数组全都定义为*然后深搜一条路。搜一步就将那一步改为‘.’但是这样会走出四个粘在一起的格子,那里就算四步,实际上那里不是四步。后来想了下。得判断什么格子可以走什么格子不可以走,一个格子只有到那里的那个方向是‘.’其余三个都是*才能走。思路仅供参考不知道华东师范的服务器怎么了提交不了题目所以这代码还是没有提交的。
袋鼠妈妈找孩子
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 列。
用 .
表示空地,用 *
表示墙。袋鼠妈妈所在的位置和孩子所在的位置用 .
表示。
数据保证有解。
Source
2017 华东师范大学网赛
代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char map[10][10];
int dir[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
int m,n;
int dfs(int x,int y,int step,int s)
{ //printf("%d %d\n",x,y);
map[x][y]='.';
if(x==1&&y==1)
{
if(step>=s) return 1;
else return 0;
}
for(int i=0;i<4;i++)
{
int xx=x+dir[i][0];int yy=y+dir[i][1];
if(xx<1||xx>n||yy<1||yy>m||map[xx][yy]!='*') continue;//当这个格子不符合物理标准。
int sum=0;
for(int j=0;j<=4;j++)
{
if(map[xx+dir[j][0]][yy+dir[j][1]]=='.') sum++;//当这个格子的旁边有一个点。这个格子的四周只可以有1个点
}
if(sum>1) continue;
map[xx][yy]='.';
if(dfs(xx,yy,step+1,s)) return 1;
map[xx][yy]='*';
}
return 0;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
map[i][j]='*';
}
dfs(x,y,0,k);//反着走。
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
printf("%c",map[i][j]);
}
printf("\n");
}
}
}