hdu 2821 Pusher (dfs)
2015-03-22 12:03
399 查看
题意:说有一个人推箱子,每次推时他要和箱子间隔一个空格子,一个格子上有x个箱子,则这些箱子会消失一个,另外n-1个推到了相邻格子的地方。
思路:首先,遍历整个图尝试每个格子,若能开始则一直走到边界或碰到箱子为止,只有碰到箱子时才记录路径。特别注意记录方向!
思路:首先,遍历整个图尝试每个格子,若能开始则一直走到边界或碰到箱子为止,只有碰到箱子时才记录路径。特别注意记录方向!
#include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> #include<queue> #include<map> using namespace std; #define N 30 #define ll long long const int inf=0x7fffffff; int n,m,sum; char str ; char path[N*N]; char ch[10]={"URDL"}; int g ; int dir[4][2]={-1,0,0,1,1,0,0,-1}; bool judge(int x,int y) { if(x>=0&&x<m&&y>=0&&y<n) return true; return false; } bool dfs(int x,int y,int cnt) { int i,di,dj; if(cnt==sum) { path[cnt]='\0'; return true; } for(i=0;i<4;i++) { di=x+dir[i][0]; dj=y+dir[i][1]; if(g[di][dj]) continue; while(g[di][dj]==0) { di+=dir[i][0]; dj+=dir[i][1]; } if(!judge(di,dj)) continue; int tmp=g[di][dj]; g[di][dj]=0; g[di+dir[i][0]][dj+dir[i][1]]+=tmp-1; path[cnt]=ch[i]; if(dfs(di,dj,cnt+1)) return true; g[di][dj]=tmp; g[di+dir[i][0]][dj+dir[i][1]]-=tmp-1; } return false; } int main() { int i,j; while(scanf("%d%d",&n,&m)!=-1) { for(i=sum=0;i<m;i++) { scanf("%s",str[i]); for(j=0;j<n;j++) { if(str[i][j]=='.') g[i][j]=0; else g[i][j]=str[i][j]-'a'+1; sum+=g[i][j]; } } for(i=0;i<m;i++) { for(j=0;j<n;j++) { if(!g[i][j]&&dfs(i,j,0)) break; } if(j<n) break; } printf("%d\n%d\n",i,j); puts(path); } return 0; }
相关文章推荐
- hdu 2821 Pusher (dfs)
- hdu 2821 Pusher (dfs)
- HDU-2821-Pusher(DFS)
- DFS-hdu-2821-Pusher
- DFS-hdu-2821-Pusher
- hdu 2821 Pusher (dfs)
- hdu 2821 Pusher(dfs)
- HDU 2821--Pusher
- HDU 2821 DFS
- HDU 2821 Pusher
- HDU 2821 Pusher
- HDU 2821 Pusher
- HDU 2821 Pusher
- Problem U:Pusher(HDU 2821)
- hdu 2821(dfs)
- HDU 2821 Pusher
- hdu 2821 学习一点dfs的小技巧吧。。 还是自己太弱了
- hdu 2821 Pusher 附几组数据
- hdu 2821 DFS
- HDU 2821 Pusher