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