您的位置:首页 > 其它

HDU 2821 Pusher

2015-03-15 11:43 387 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2821

代码如下

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;

struct point{
    int x,y;
}S;

int r,c;
int xx[4]={1,0,-1,0};
int yy[4]={0,1,0,-1};
int _map[30][30];
int sum;
int vis[30][30];
int route[1000],um;//记录路径

bool judge(point h){//判断是否在图内
    if(h.x>=0 && h.x<r && h.y>=0 && h.y<c) return true;
    return false;
}

bool gohead(point &h,int a){//一直往前走,若能碰到箱子,返回true,否则返回false;同时h变为箱子前一个位置
    bool tag=false;
    point next;
    next.x=h.x+xx[a];
    next.y=h.y+yy[a];
    while(judge(next)){
        if(_map[next.x][next.y])
            tag=true;
        h=next;
        next.x=h.x+xx[a];
        next.y=h.y+yy[a];
        if(tag) break;
    }
    if(tag) return true;
    return false;
}

bool DFS(point s){
    if(sum == 0){
        return true;
    }
    for(int i=0;i<4;i++){
        point t;
        int xi=t.x=s.x+xx[i];
        int yi=t.y=s.y+yy[i];
        if(judge(t) && !_map[xi][yi] && gohead(t, i)){
            int tmp=_map[t.x][t.y];
            _map[t.x+xx[i]][t.y+yy[i]]=_map[t.x+xx[i]][t.y+yy[i]]+(tmp-1);
            _map[t.x][t.y]=0;
            sum--;
            route[um++]=i;
            if(DFS(t))
                return true;
            sum++;
            um--;
            _map[t.x][t.y]=tmp;
            _map[t.x+xx[i]][t.y+yy[i]]=_map[t.x+xx[i]][t.y+yy[i]]-(tmp-1);
        }
    }
    return false;
}

int main(){
    while(~scanf("%d%d",&c,&r)){
        getchar();
        memset(_map,0,sizeof(_map));
        sum=0;
        for(int i=0;i<r;i++){
            for(int j=0;j<c;j++){
                char tt;
                scanf("%c",&tt);
                if(tt>='a'&&tt<='z'){
                    _map[i][j]=tt-'a'+1;
                    sum+=_map[i][j];
                }
            }
            getchar();
        }
        bool tag=false;
        for(int i=0;i<r;i++){//对地图全部每个点dfs
            for(int j=0;j<c;j++){
                S.x=i; S.y=j;
                um=0;
                if(_map[S.x][S.y]) continue;
                if(DFS(S)){
                    tag=true;
                    break;
                }
            }
            if(tag) break;
        }
        if(tag){
            printf("%d\n%d\n",S.x,S.y);
            for(int i=0;i<um;i++){
                if(route[i]==0)
                    printf("D");
                else if(route[i]==1)
                    printf("R");
                else if(route[i]==2)
                    printf("U");
                else printf("L");
            }
        }
        printf("\n");
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: