HDU_DFS_2812

来源:互联网 发布:海康ivms4500软件下载 编辑:程序博客网 时间:2024/06/02 02:39
//这个游戏就是选这点推球撞堆木出格//原来不是撞一下反弹回去,而是我们在去推//因为没弄懂玩法,一直搞不懂,注释之后才看明白#include<iostream>#include<cstdio>#include<cstring>const int maxn = 30;using namespace std;char map[maxn][maxn];int dp[maxn][maxn];int r,c,tot;int fx[] = {-1,1,0,0};//上下左右int fy[] = {0,0,-1,1};char fang[]="UDLR";char path[1010];int chare(int x, int y){    if(x>=0&&x<r&&y>=0&&y<c)        return 1;     return 0;}int dfs(int x, int y,int len)//空格位置进入{    if(len >= tot)//如果个数撸了就结束    {        path[len] = 0;        return 1;    }    for(int i = 0; i < 4; i++)//四个方向走试试    {        int xi = x+fx[i];//        int yi = y+fy[i];//        if(!chare(xi,yi)||dp[xi][yi])continue;//越界,有木头(临近),这个方向不行        while(chare(xi,yi)&&!dp[xi][yi])      //一直走下去直到边界或者木头        {            xi += fx[i];            yi += fy[i];        }        if(!chare(xi+fx[i], yi+fx[i]))continue;//确认一下出界了没有(撞击之后,会推一格,或者唯一木直接滑出)        int tmp = dp[xi][yi];                  //堆的木头数        dp[xi+fx[i]][yi+fy[i]] += tmp-1;//退一格之后的木头数        dp[xi][yi] = 0;//当前格木头为0        path[len] = fang[i];//记录路径        if(dfs(xi,yi,len+1))return 1;//结束        dp[xi+fx[i]][yi+fy[i]] -= tmp-1;//回溯,当前个再次掳走        dp[xi][yi] = tmp;//当前格恢复原状    }    return 0;}int main(){    while(scanf("%d%d",&c,&r) != EOF)//c列r行    {        memset(dp,0,sizeof(dp));        tot = 0;        for(int i = 0; i < r; i++)            scanf("%s",map[i]);        for(int i = 0; i < r; i++)        {            for(int j = 0; j < c; j++)            {                if(map[i][j] != '.')                {                    dp[i][j] = map[i][j]-'a'+1;                    tot += dp[i][j];                }            }        }        int flag = 0;        for(int i = 0;  i< r; i++)        {            for(int j = 0; j < c; j++)            {                if(dp[i][j] == 0 && dfs(i,j,0))//枚举空位,看是否可放                {                    flag = 1;                    printf("%d\n%d\n",i,j);                    printf("%s\n",path);                    break;                }            }            if(flag)                break;        }    }    return 0;}
0 0