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