标签:
http://acm.hdu.edu.cn/showproblem.php?pid=1010
折磨我一下午
题目大意: 从s点走到d点能否恰好走k步 刚开始以为是广搜,其实是深搜。
dfs多优化一下才会过。
#include<stdio.h> #include<stdlib.h> #include<algorithm> #include<math.h> #include<string.h> #include<iostream> #include<queue> #include<ctype.h> using namespace std; #define N 10 #define memset(a,b) memset(a,b,sizeof(a)) #define Lson r<<1|1 #define Rson r<<1 struct node { int x,y,step; }s,e; int n,m,k; int dis[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; int vis[N][N]; char maps[N][N]; int is=0; void dfs(node t) { if(is) return; if(t.x==e.x && t.y==e.y && t.step==k) { is=true; return; } if(t.step>=k) return; int Min=(int)(abs(t.x-e.x)+abs(t.y-e.y)); if(Min>k-t.step) return; if(Min%2!=(k-t.step)%2) return; if(t.x==e.x && t.y==e.y) return; node q; for(int i=0;i<4;i++) { q.x=t.x+dis[i][0]; q.y=t.y+dis[i][1]; q.step=t.step+1; if(is || q.x<0 || q.x>=n || q.y<0 || q.y>=m || maps[q.x][q.y]==‘X‘) continue; if(q.x==e.x && q.y==e.y && q.step==k) { is=true; return; } char ch=maps[q.x][q.y]; maps[q.x][q.y]=‘X‘; dfs(q); maps[q.x][q.y]=ch; } } int main() { while(scanf("%d %d %d",&n,&m,&k),n+m+k) { memset(maps,0); int ans=0; for(int i=0;i<n;i++) { scanf("%s",maps[i]); for(int j=0;j<m;j++) { if(maps[i][j]==‘S‘) { s.x=i; s.y=j; s.step=0; } else if(maps[i][j]==‘D‘) { e.x=i; e.y=j; } else ans++; } } if(k-1>ans) { printf("NO\n"); continue; } maps[s.x][s.y]=‘X‘; is=0; dfs(s); if(is==true) printf("YES\n"); else printf("NO\n"); } return 0; }
Tempter of the Bone---hdu1010(dfs+剪枝)
标签:
原文地址:http://www.cnblogs.com/linliu/p/5486271.html