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;
}