没什么好注意的。。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();
}
}