hdu 1010 (DFS+剪枝)

来源:互联网 发布:vue.js 页面加载动画 编辑:程序博客网 时间:2024/06/09 14:53

点击打开链接

分析:

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

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

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


#include"stdio.h"#include"string.h"#include"math.h"#define zz 10int 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;}


原创粉丝点击