【搜索】 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();
    }
}


posted @ 2014-09-16 22:45  kewowlo  阅读(136)  评论(0编辑  收藏  举报