Pusher
题目链接:HDU - 2821题意:给出一个R*C的格子, 每个格子中, '.'表示为空,小写字母x表示在这个格子中有x-'a'+1个板子;
选一个初始位置, 推板子, 当与板子不直接相邻时, 可以移掉该方向上的最近的一堆板子上的一个板子, 并将这堆板子向后推一格, 问选那个初始位置可以将板子都清除, 并输出操作;每次移动只能直线移动不撞板子不回头;
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <stack> #include <queue> using namespace std; int R, C; char G[30][30]; struct node{ int pre; char op; }; int G0[30][30]; char path[2000]; int sum; int dir[4][2]={1, 0, 0, 1, 0, -1, -1, 0}; char op[]={'D', 'R', 'L', 'U'}; int judge(int x, int y){ if(x<0||y<0||x>=R||y>=C) return 0; return 1; } int dfs(int x, int y, int num){ if(num==sum){ path[num]='\0'; return 1; } for(int i=0; i<4; i++){ int tx, ty; tx=x+dir[i][0]; ty=y+dir[i][1]; if(!judge(tx, ty)||G0[tx][ty]) continue; while(judge(tx, ty)&&!G0[tx][ty]){ tx+=dir[i][0]; ty+=dir[i][1]; } if(!judge(tx, ty)) continue; int t=G0[tx][ty]; G0[tx+dir[i][0]][ty+dir[i][1]]+=t-1; G0[tx][ty]=0; path[num]=op[i]; if(dfs(tx, ty, num+1)) return 1; G0[tx][ty]=t; G0[tx+dir[i][0]][ty+dir[i][1]]-=t-1; } return 0; } int main(){ while(~scanf("%d%d", &C, &R)){ sum=0; for(int i=0; i<R; i++){ scanf("%s", G[i]); for(int j=0; j<C; j++){ if(G[i][j]=='.') G0[i][j]=0; else G0[i][j]=G[i][j]-'a'+1, sum+=G0[i][j]; } } int flag=0; for(int i=0; i<R; i++){ for(int j=0; j<C; j++){ if(!G0[i][j]&&dfs(i, j, 0)){ printf("%d\n%d\n%s\n", i, j, path); flag=1; break; } } if(flag) break; } } return 0; }