标签:
XXXXXXXX XXOXXXXX XXXXXXXX XXXXXXXX XOXXXXOX XXXXXXXX XXXXXXXX XXXXXXXX XOXOXOOX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
CASE #1: 4 6 L 1 2 D CASE #2: 1 1 R 1 4 L 1 3 R
题意:
在一个7*8的板子上,有若干个球(小于12个,经测试最多11个)。你每次可以选择一个球向上下左右推动,
能推动的条件是推动的方向上有球但是不能粘在一起,中间必需得隔一个及以上的格子。然后你推动这个球后它
会一直在这个方向上滚动,直到碰到下一个球或者掉下板子去。如果碰到下一个球他的动能会传递下去,如果碰
到的球紧挨着另一个球就隔山打牛,而原来的球就停在碰到的球的前一个位置上。然后结束标志是板子上只剩一
个球。输出每次操作的球的坐标和推动的方向(ULRD)。
#include <iostream> #include <string> #include <iomanip> #include <cstring> #include <algorithm> #include <stdio.h> using namespace std; char ch[10][10]; int cur[4][2] = {{-1,0},{0,-1},{0,1},{1,0}}; //U、L、R、D char ch1[] = "ULRD"; int n=7,m=8,cnt; int path[15];int pathc[15]; int cmp(int bx,int by) { if(bx<0||by<0||bx>=n||by>=m) return 0; return 1; } int dfs(int ax) { if(ax==cnt-1) return 1; int tx[15],ty[15],i,j,k,dx,dy; for( i=0;i<n;i++) { for(j=0;j<m;j++) if(ch[i][j]==‘O‘) { for(k=0;k<4;k++) { int mo=0;int cd=0; dx=i+cur[k][0]; dy=j+cur[k][1]; if(ch[dx][dy]==‘O‘) continue; while(cmp(dx,dy)) { if(ch[dx][dy]==‘O‘) { mo=1; tx[cd]=dx; ty[cd++]=dy; } dx+=cur[k][0]; dy+=cur[k][1]; } if(mo) { ch[i][j]=‘X‘; for(int ii=0;ii<cd;ii++) { ch[tx[ii]][ty[ii]]=‘X‘; ch[tx[ii]-cur[k][0]][ty[ii]-cur[k][1]]=‘O‘; } path[ax]=i*m+j; pathc[ax]=k; if(dfs(ax+1)) return 1; ch[i][j]=‘O‘; dx=i+cur[k][0]; dy=j+cur[k][1]; while(cmp(dx,dy)) { if(ch[dx][dy]==‘O‘) ch[dx][dy]=‘X‘; dx+=cur[k][0]; dy+=cur[k][1]; } for(int ii=0;ii<cd;ii++) ch[tx[ii]][ty[ii]]=‘O‘; } } } } return 0; } int main() { int i,j,p=0; while(~scanf("%s",&ch[0])) { for(i=1;i<n;i++) cin>>ch[i]; cnt=0; for(i=0;i<n;i++) for(j=0;j<m;j++) if(ch[i][j]==‘O‘) cnt++; dfs(0); if(p) cout<<endl; cout<<"CASE #"<<++p<<":"<<endl; for(i=0;i<cnt-1;i++) cout<<path[i]/m<<" "<<path[i]%m<<" "<<ch1[pathc[i]]<<endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/fenhong/p/5280857.html