码迷,mamicode.com
首页 > 其他好文 > 详细

HDU 2821Pusher(DFS )

时间:2015-08-02 10:18:25      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:hdu2821

题意:是一个游戏,可以玩下,就很清楚了,给你有箱子的图,你现在选择一个初始位置,并确定推的方向序列,规则:你要和箱子至少有一个空格才可以推,每次是先拿掉一个箱子,再把剩余的箱子(如果还存在的话)推向下一格,选择一个方向后要一直沿着这个方向走到不能走为止。

#include<bits/stdc++.h>
#define cl(a,b) memset(a,b,sizeof(a));
#define LL long long
#define out(x) cout<<x<<endl;
using namespace std;
const int maxn=30;
const int inf=9999999;
char tmp[maxn][maxn];
int n,m;
int a[maxn][maxn];
int dir[][2]={{1,0},{0,1},{-1,0},{0,-1}};
char dirr[]="DRUL";//对应dir的方向
char path[maxn*105];//记录方向序列
int allNum;//所有的箱子数
bool pan(int x,int y){
    if(x>=0&&x<n&&y>=0&&y<m)return true;
    return false;
}
bool dfs(int x,int y,int num){
    if(num==allNum){
        path[num]=0;
        return true;
    }
    for(int i=0;i<4;i++){
        int xx=x+dir[i][0];
        int yy=y+dir[i][1];
        if(!pan(xx,yy)||a[xx][yy])continue;//判断从(x,y)这一方向出发是否合法,1.在图里,2.不能有箱子
        while(pan(xx,yy)&&!a[xx][yy]){//沿着这个方向继续探测
            xx+=dir[i][0];
            yy+=dir[i][1];
        }
        if(!pan(xx,yy))continue;//判断while结束的条件
        int t=a[xx][yy];
        a[xx+dir[i][0]][yy+dir[i][1]]+=t-1;
        path[num]=dirr[i];
        a[xx][yy]=0;
        if(dfs(xx,yy,num+1))return true;
        a[xx+dir[i][0]][yy+dir[i][1]]-=t-1;//回溯把图复原
        a[xx][yy]=t;
    }
    return false;
}

int main(){

    while(~scanf("%d%d",&m,&n)){
        allNum=0;
        for(int i=0;i<n;i++){
            scanf("%s",tmp[i]);
            for(int j=0;j<m;j++){
                if(tmp[i][j]>=‘a‘&&tmp[i][j]<=‘z‘){
                    allNum+=tmp[i][j]-‘a‘+1;
                    a[i][j]=tmp[i][j]-‘a‘+1;
                }
                else {
                    a[i][j]=0;
                }
            }
        }

        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++)if(!a[i][j]&&dfs(i,j,0)){
                printf("%d\n%d\n%s\n",i,j,path);
                goto A;
            }
        }
        A:;
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

HDU 2821Pusher(DFS )

标签:hdu2821

原文地址:http://blog.csdn.net/u013167299/article/details/47204493

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!