HDU 2821 DFS

来源:互联网 发布:mmd威风堂堂动作数据 编辑:程序博客网 时间:2024/05/17 22:40
////  main.cpp//  HDU 2821 DFS////  Created by 郑喆君 on 8/12/14.//  Copyright (c) 2014 itcast. All rights reserved.//#include<cstdio>#include<cstring>#include<iostream>#include<iomanip>#include<queue>#include<cmath>#include<stack>#include<map>#include<vector>#include<set>#include<algorithm>using namespace std;typedef long long LL;const int int_max = 0x07777777;const int int_min = 0x80000000;int mymap[30][30];int dir[4][2] = {-1,0,0,1,1,0,0,-1};int n,m,tot,flag;vector<int> ret;void dfs (int x, int y, int cur){    if(cur==tot){        flag = 1;        return;    }    for(int i = 0; i < 4 && flag==0; i++){        int temp[30][30];        memcpy(temp, mymap, sizeof(mymap));        int j = 1;        while (flag==0) {            int xx = x + dir[i][0]*j;            int yy = y + dir[i][1]*j;            if(xx>=0 && xx<n && yy>=0 && yy<m){                if(mymap[xx][yy]){                    if(j > 1){                        int xxx = xx + dir[i][0];                        int yyy = yy + dir[i][1];                        if(xxx>=0 && xxx<n && yyy>=0 && yyy<m){                            mymap[xxx][yyy] = mymap[xx][yy]-1+mymap[xxx][yyy];                            mymap[xx][yy] = 0;                            ret.push_back(i);                            dfs(xx, yy, cur+1);                            if (flag) break;                            ret.erase(ret.begin()+ret.size()-1);                        }else{                            int tt = mymap[xx][yy];                            mymap[xx][yy] = 0;                            ret.push_back(i);                            dfs(xx, yy, cur+tt);                            if(flag) break;                            ret.erase(ret.begin()+ret.size()-1);                        }                    }                    break;                }            }else {                break;            }            j++;        }        memcpy(mymap, temp, sizeof(mymap));    }    }int main(int argc, const char * argv[]){    while (scanf("%d %d", &m, &n)!=EOF) {        memset(mymap, 0, sizeof(mymap));        tot = 0;        flag = 0;        for(int i = 0; i < n; i++){            char cs[30];            scanf("%s", cs);            for(int j = 0; j < m; j++){                if(cs[j]!='.'){                    mymap[i][j] = cs[j]-'a'+1;                    tot += mymap[i][j];                }            }        }        ret.clear();        int reti = 0, retj = 0;        for(int i = 0; i < n&&flag==0; i++){            for(int j = 0; j < m&&flag==0; j++){                if(mymap[i][j]) continue;                dfs(i,j,0);                if(flag==1){                    reti = i;                    retj = j;                }            }        }        cout << reti << endl;        cout << retj << endl;        for(int i = 0; i < ret.size(); i++){            if(ret[i]==0) printf("U");            if(ret[i]==1) printf("R");            if(ret[i]==2) printf("D");            if(ret[i]==3) printf("L");        }        cout << endl;    }}

0 0
原创粉丝点击