void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

给出一个地图,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;
}
posted on 2011-05-14 22:11  void-man  阅读(269)  评论(0)    收藏  举报