注意测试数据hdu 1010 (DFS+剪枝)

发一下牢骚和主题无关:

    点击开打链接

    分析:

    BFS,DFS,都可以,只要拍注意剪枝就能够了。

    注意标题中要求只能在T秒到D。

    标题中有坑。测试数据中每行有余多的空格。。。就这一卡点了一个晚上

    

    每日一道理
毅力,是千里大堤一沙一石的凝聚,一点点地累积,才有前不见头后不见尾的壮丽;毅力,是春蚕吐丝一缕一缕的环绕,一丝丝地坚持,才有破茧而出重见光明的辉煌; 毅力,是远航的船的帆,有了帆,船才可以到达成功的彼岸。
#include"stdio.h"
#include"string.h"
#include"math.h"
#define zz 10

int mark[zz][zz];
char map[zz][zz];
int n,m,t,s,e,ss,ee,f;
int dir[4][2]={1,0,0,1,-1,0,0,-1};

void dfs(int x,int y,int t)
{
	int i,dis;
	int xx,yy;
	if(x==ss&&y==ee)
	{
		if(t==0)f=1;
		return ;
	}
	if(f==1)return ;
	dis=abs(x-ss)+abs(y-ee);
	if(dis>t||(t-dis)%2!=0)return ;
	for(i=0;i<4;i++)
	{
		xx=x+dir[i][0];
		yy=y+dir[i][1];
		if(xx>=0&&xx<n&&yy>=0&&yy<m&&!mark[xx][yy]&&map[xx][yy]!='X')
		{
			mark[xx][yy]=1;
			dfs(xx,yy,t-1);
			mark[xx][yy]=0;
		}
	}
}

int main()
{
	int i,j,k;
	while(scanf("%d %d %d%*c",&n,&m,&t)!=-1&&(n+m+t))
	{
		k=0;
		memset(map,0,sizeof(map));
		memset(mark,0,sizeof(mark));
		for(i=0;i<n;i++)
		{
			for(j=0;j<m;j++)
			{
				scanf("%c",&map[i][j]);
				if(map[i][j]=='S')
					s=i,e=j;
				if(map[i][j]=='D')
					ss=i,ee=j,k++;
				if(map[i][j]=='.')
					k++;
			}
			scanf("%*c");
		}
		
		if(k<t)
		{
			printf("NO\n");
			continue;
		}
		f=0;
		mark[s][e]=1;
		dfs(s,e,t);
		if(f==1)printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}

文章结束给大家分享下程序员的一些笑话语录: 爱情观
  爱情就是死循环,一旦执行就陷进去了。
  爱上一个人,就是内存泄露--你永远释放不了。
  真正爱上一个人的时候,那就是常量限定,永远不会改变。
  女朋友就是私有变量,只有我这个类才能调用。
  情人就是指针用的时候一定要注意,要不然就带来巨大的灾难。

posted @ 2013-05-02 20:32  坚固66  阅读(152)  评论(0编辑  收藏  举报