1. 程式人生 > >POJ3009-Curling 2.0(WA)

POJ3009-Curling 2.0(WA)

col 移動 最優解 stp center ext 是否 也不會 如果

POJ3009-Curling 2.0

題意:

要求把一個冰壺從起點“2”用最少的步數移動到終點“3”

其中0為移動區域,1為石頭區域,冰壺一旦想著某個方向運動就不會停止,也不會改變方向(想想冰壺在冰上滑動),除非冰壺撞到石頭1 或者 到達終點 3

如果能在10步以內到達終點,輸出到達終點所需的步數,否則輸出-1

註意的是:

冰壺撞到石頭後,冰壺會停在石頭前面,此時(靜止狀態)才允許改變冰壺的運動方向,而該塊石頭會破裂,石頭所在的區域由1變為0. 也就是說,冰壺撞到石頭後,並不會取代石頭的位置。

終點是一個摩擦力很大的區域,冰壺若到達終點3,就會停止在終點的位置不再移動。

解題思路:

DFS,回溯,利用條件進行優良的剪枝來控制時間

以下代碼會WA……想不破哎:-( 暫留

 1 #include<iostream>
 2 using namespace std;
 3 const int maxn = 30;
 4 int square[maxn][maxn];
 5 int w,h;
 6 int r0,c0,r2,c2;
 7 int bestp;///最優解
 8 const int dh[4] = {-1,0,1,0};///向上0,右1,下2,左3
 9 const int dw[4] = { 0,1,0,-1};
10 
11 bool inside(int x,int y)
12 {
13     return x>=1
&& x <= h && y>=1 && y<=w; 14 } 15 16 bool walk(int x,int y,int dir,int &xx,int &yy) 17 {///保證不滑到外面去 18 ///遇到墻面,需要改變square 19 ///到達終點,就停止 20 ///如果可行,需要改變當前的位置x,y 21 int tempx = x+dh[dir]; 22 int tempy = y+dw[dir]; 23 ///首先檢測當前方位是否可以滑動 24 if(inside(tempx,tempy) && square[tempx][tempy] == 1
) return false;///第一步是墻面,不能滑動 25 26 while(true) 27 { 28 if(!inside(tempx,tempy)) return false;//滑倒了場外 29 if(square[tempx][tempy] == 3)//到達了終點 30 { 31 xx = tempx;yy = tempy; 32 return true; 33 } 34 if(square[tempx+dh[dir]][tempy+dw[dir]] == 1)///下一步滑到墻面 35 { 36 xx = tempx;yy = tempy; 37 square[tempx+dh[dir]][tempy+dw[dir]] = 0;///改變場地狀態 38 return true; 39 } 40 tempx+=dh[dir];tempy+=dw[dir];///劃動一格 41 } 42 } 43 void dfs(int x,int y,int deep) 44 { 45 46 ///臨界條件 47 if(x==r2 && y==c2) 48 {///尋找最優解 49 if(deep < bestp) 50 bestp = deep; 51 return; 52 } 53 for(int i=0;i<=3;i++) 54 { 55 int xx,yy; 56 bool flag = walk(x,y,i,xx,yy); 57 if(flag && deep<10) 58 dfs(xx,yy,deep+1); 59 ///回溯 60 if(flag && square[xx][yy] != 3) 61 { 62 square[xx+dh[i]][yy+dw[i]] = 1;///改變場地狀態 63 } 64 65 } 66 return; 67 } 68 69 int main() 70 { 71 while(cin>>w>>h && w && h) 72 { 73 for(int i=1;i<=h;i++)/// 74 for(int j=1;j<=w;j++)/// 75 { 76 cin>>square[i][j]; 77 if(square[i][j]==2) 78 { 79 r0=i;c0=j; 80 square[i][j]=0; 81 } 82 if(square[i][j]==3) 83 { 84 r2=i;c2=j; 85 } 86 } 87 bestp = 20; 88 dfs(r0,c0,0); 89 if(bestp>10) 90 { 91 cout<<-1<<endl; 92 } 93 else 94 cout<<bestp<<endl; 95 } 96 return 0; 97 }

POJ3009-Curling 2.0(WA)