给出一个地图,X标记不可走,D表示门,S表示起点,每次走上下左右走一个点,问你在所给的时间,刚好走到D么?并且每个点不能重复走
最近看了不少DFS,感觉没神马长进啊........
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <math.h>
#include <queue>
using namespace std;
char map[10][10];
int n,m,Time,flag,aa,bb;
int dir[][2] = {{0,1},{0,-1},{1,0},{-1,0}};
int used[10][10];
int t;
void DFS(int a,int b)
{
if(flag)return ;
int dis,x,y;
dis=abs(a-aa)+abs(b-bb);
if(dis>Time-t)return ;
if(dis%2!=(Time-t)%2)return ;
if(t==Time&&map[a][b]=='D'){flag=true;return;}
for(int i=0;i<4;i++)
{
int x=a+dir[i][0],y=b+dir[i][1];
if(x>=0&&x<n&&y>=0&&y<m&&!used[x][y]&&map[x][y]!='X')
{
t++;
used[x][y]=1;
DFS(x,y);
t--;
used[x][y]=0;
}
}
}
int main()
{
int len,i,k,a,b;
while( scanf("%d%d%d",&n,&m,&Time) && ( n || m || Time ) )
{
int wall = 0;
for(k=0; k<n; k++)
{
scanf("%s",map[k]);
for(i=0; i<m; i++)
{
if( map[k][i] == 'S' )
{
a = k;
b = i;
}
if( map[k][i] == 'D' )
{
aa = k;
bb = i;
}
if( map[k][i] == 'X' )
wall++;
}
}
if( n*m-wall-1 < Time || abs(a-aa) + abs(b-bb) > Time )
{
printf("NO\n");
continue;
}
flag = t = 0;
memset(used,0,sizeof(used));
used[a][b] = 1;
DFS(a,b);
if( flag == 1 )
printf("YES\n");
else
printf("NO\n");
}
return 0;
}

浙公网安备 33010602011771号