4 4 5 S.X. ..X. ..XD .... 3 4 5 S.X. ..X. ...D 0 0 0
NO YES
给你一个N行M列的迷宫,X代表墙,"."代表路,S代表起点,D代表终点,问能不能刚好在K秒从起点到达终点。
题解:
模板DFS,不需要剪枝。开一个二维数组表示向上下左右走,开一个oount记录步数,若count>K,还没走到就直接break。
参考代码:
#include<cmath>
#include<iostream>
using namespace std;
char str[10][10];
int map[10][10],v[4][2]={0,1,0,-1,1,0,-1,0};
int n,m,k,i,j,flag,ax,ay,bx,by;
void dfs(int x,int y,int count)
{
int mx,my;
if(bx==x&&by==y)
{
if(k==count)
flag=1;
return;
}
if(count>=k)
return;
if(str[x][y]!='X')
{
for(int i=0;i<4;i++)
{
mx=x+v[i][0];
my=y+v[i][1];
if(mx>=1&&mx<=n&&my>=1&&my<=m&&!map[mx][my]&&str[mx][my]!='X')
{
map[mx][my]=1;
dfs(mx,my,count+1);
map[mx][my]=0;
if(flag)
return;
}
}
}
}
int main()
{
while(scanf("%d%d%d",&n,&m,&k)!=EOF&&(n+m+k))
{
memset(map,0,sizeof(map));
int count;
for(i=1;i<=n;i++)
{
getchar();
for(j=1;j<=m;j++)
{
scanf("%c",&str[i][j]);
if(str[i][j]=='S')
{
ax=i;
ay=j;
}
if(str[i][j]=='D')
{
bx=i;
by=j;
}
}
}
getchar();
if(abs(bx-ax)+abs(by-ay)>k||(ax+bx+ay+by+k)%2==1)
printf("NO\n");
else
{
flag=0;
count=0;
map[ax][ay]=1;
dfs(ax,ay,count);
if(flag)
printf("YES\n");
else
printf("NO\n");
}
}
return 0;
}
版权声明:本文为博主原创文章,随便转载。
HDU - 1010 Tempter of the Bone 深搜模板题(DPS)解题报告
原文:http://blog.csdn.net/luwhere/article/details/47135317