POJ-3009

POJ-3009 冰壶

 题目自行查看:http://poj.org/problem?id=3009

 一道经典搜索题,挺费时间

 注意:输入很坑,先列后行

  dfs不加优化轻松(调了大半天)

 Sample Input

2 1
3 2
6 6
1 0 0 2 1 0
1 1 0 0 0 0
0 0 0 0 0 3
0 0 0 0 0 0
1 0 0 0 0 1
0 1 1 1 1 1
6 1
1 1 2 1 1 3
6 1
1 0 2 1 1 3
12 1
2 0 1 1 1 1 1 1 1 1 1 3
13 1
2 0 1 1 1 1 1 1 1 1 1 1 3
0 0

 Sample Output

1
4
-1
4
10
-1

1
#include<iostream> 2 using namespace std; 3 int a[25][25],n,m,sx,sy,flag=0,ans=99999999; 4 int dx[4]={0,0,1,-1}; 5 int dy[4]={1,-1,0,0}; 6 void dfs(int x,int y,int step) 7 { 8 if(step>=ans||step>=10) return;//超过10步自动结束(题目要求) 9 for(int i=0;i<4;i++) 10 { 11 int tx=x+dx[i]; 12 int ty=y+dy[i]; 13 if(a[tx][ty]==1) continue;//前方砖块continue 14 while(tx>0&&tx<=n&&ty>0&&ty<=m&&a[tx][ty]!=1&&a[tx][ty]!=3) 15 { 16 tx+=dx[i]; 17 ty+=dy[i];//前进 18 }//一直前进,直到砖块或终点 19 if(tx<=0||ty<=0||tx>n||ty>m) continue;//超限continue 20 if(a[tx][ty]==3) 21 { 22 flag=1; 23 ans=step+1;//多走一步 24 return; 25 } 26 else 27 { 28 a[tx][ty]=0; 29 dfs(tx-dx[i],ty-dy[i],step+1);//回溯 30 a[tx][ty]=1; 31 } 32 } 33 return; 34 } 35 int main() 36 { 37 while(cin>>m>>n&&n!=0&&m!=0) 38 { 39 for(int i=1;i<=n;i++) 40 for(int j=1;j<=m;j++) 41 { 42 cin>>a[i][j]; 43 if(a[i][j]==2) 44 { 45 a[i][j]=0;//把起点标注为空地 46 sx=i; 47 sy=j; 48 } 49 } 50 dfs(sx,sy,0); 51 if(flag) cout<<ans<<endl; 52 else cout<<-1<<endl; 53 ans=99999999; 54 flag=0; 55 } 56 }
搜索chishi

 

posted @ 2018-08-07 16:33  unsigned_XB  阅读(157)  评论(0编辑  收藏  举报