您的位置:首页 > 其它

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


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: