【搜索】 HDU 2821 Pusher DFS
没什么好注意的。。DFS
一个位置上可能有好几个箱子
必须要离该箱子2个格子以上的距离才能推动它
推一次箱子该箱子向反方向退一格(若退出边界则无效),并且箱子减少一个
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <string> #include <iostream> #include <algorithm> #include <sstream> #include <math.h> using namespace std; #include <queue> #include <stack> #include <vector> #include <deque> #include <set> #include <map> #define cler(arr, val) memset(arr, val, sizeof(arr)) #define IN freopen ("in.txt" , "r" , stdin); #define OUT freopen ("out.txt" , "w" , stdout); typedef long long LL; const int MAXN = 66666;//点数的最大值 const int MAXM = 20006;//边数的最大值 const int INF = 1101521204; const int mod = 10000007; int r,c,sum,col; char sca[28][28]; int mp[28][28]; int orz[1111]; int xx[4]= {0,0,1,-1}; int yy[4]= {-1,1,0,0}; int outmp(int x,int y) { if(x<0||x>=r||y<0||y>=c) return 0; if(mp[x][y]==0) return 1; return -1; } char out[4]= {'L','R','D','U'}; bool dfs(int x,int y,int num,int cnt) { for(int i=0;i<4;i++) { int dx=x+xx[i],dy=y+yy[i]; if(outmp(dx,dy)!=1) continue; while(outmp(dx,dy)==1) dx+=xx[i],dy+=yy[i]; int nextx=dx+xx[i],nexty=dy+yy[i]; if(outmp(dx,dy)==-1&&outmp(nextx,nexty)!=0) { int mark1=mp[dx][dy]; int mark2=mp[nextx][nexty]; mp[nextx][nexty]+=mp[dx][dy]-1; mp[dx][dy]=0; orz[num]=i; col=num; if(cnt+1==sum) return true; if(dfs(dx,dy,num+1,cnt+1)) return true; mp[dx][dy]=mark1; mp[nextx][nexty]=mark2; } } return false; } void solve() { for(int i=0; i<r; i++) for(int j=0; j<c; j++) if(mp[i][j]==0) if(dfs(i,j,0,0)) { printf("%d\n%d\n",i,j); for(int i=0;i<=col;i++) printf("%c",out[orz[i]]); puts(""); return ; } } int main() { //IN; while(scanf("%d%d",&c,&r)!=EOF) { sum=0; for(int i=0; i<r; i++) { scanf("%s",sca[i]); for(int j=0; j<c; j++) if(sca[i][j]!='.') { mp[i][j]=sca[i][j]-'a'+1; sum+=mp[i][j]; } else mp[i][j]=0; } solve(); } }