HDU 1728 逃离迷宫 广搜

http://acm.hdu.edu.cn/showproblem.php?pid=1728

题意:

  一个迷宫...从起点走到终点,拐弯次数有限制的情况下找到最优的解。

 

坑爹:

  本来用结构体来记录坐标、走的步数和拐弯次数,但是发现如果搜一条路径发现行不通的话这条路上所有点都被标记了,当我再次经过这里面的某个点

的时候就不能通过了。比如说我一开始行不通的那条路通过某个点是左右通过的,但我下次再要从上或者从下经过这个点的时候就会过不了。

 

解法:

  每次向一个方向拓展时将这一个方向所有满足条件的点全部进队,这样就解决了某个点不会因为之前被标记过而导致下一次以另外一个方向进入这个店

的时候就不给经过的问题。

 

View Code
  1 #include <iostream>
  2 #include <queue>
  3 using namespace std;
  4 
  5 int n ;
  6 int m;
  7 char str[105][105];
  8 bool map[105][105];
  9 
 10 int po[4][2] = {1,0  , 0  ,1  , -1 ,0, 0 ,-1 };
 11 
 12 struct Node
 13 {
 14     int i,j;
 15     int sum ;
 16 }node[1000005];
 17 
 18 int main ()
 19 {
 20     int N;
 21     cin>>N;
 22     while (N -- )
 23     {
 24         memset(map,0,sizeof (map));
 25         
 26         cin>>n>>m;
 27         int k;
 28         int x1;
 29         int x2;
 30         int y1;
 31         int y2;
 32         
 33         for (int  i = 0; i < n; i++)
 34         {
 35             cin>>str[i];
 36         }
 37         scanf ("%d%d%d%d%d",&k,&x1,&y1,&x2,&y2);
 38         x1 -- ;
 39         x2 -- ;
 40         y1 -- ;
 41         y2 -- ;
 42         
 43         if (str[y1][x1] == '*' || str[y2][x2] == '*')
 44         {
 45             cout<<"no"<<endl;
 46             continue;
 47         }
 48         
 49         if (x1 == x2 && y1 == y2 )
 50         { 
 51             cout<<"yes"<<endl;
 52             continue ;
 53         }
 54         
 55         queue <int > Q;
 56         int t = 0;
 57         node[t].i = y1;
 58         node[t].j = x1;
 59         node[t].sum = 0;
 60         
 61         map[y1][x1] = 1;
 62         
 63         Q.push(t);
 64         
 65         int stai;
 66         int staj;
 67         int edi;
 68         int edj;
 69         int flag  = 0;
 70         
 71         while (!Q.empty ())
 72         {
 73             int temp = Q.front ();
 74             Q.pop();
 75             
 76             
 77             stai = node[temp].i;
 78             staj = node[temp].j;
 79             if ( stai == y2 && staj == x2 && node[temp].sum <= k + 1)
 80             {    
 81                 flag = 1;
 82                 break;   
 83             }
 84             if (node[temp].sum > k + 1)
 85             {
 86                 break;
 87             }
 88             
 89             for (int i=0; i<4; i++)
 90             {
 91                 edi = stai + po[i][0];
 92                 edj = staj + po[i][1];
 93                 while (edi >= 0 && edi <n && edj >= 0 && edj  < m && str[edi][edj] == '.'  )
 94                 {  
 95                     if (map[edi][edj])
 96                     {
 97                         edi = edi + po[i][0];
 98                         edj = edj + po[i][1];
 99                         continue;
100                     }
101                     
102                     t ++ ;
103                     node[t] .i = edi;
104                     node[t]. j = edj;
105                     node[t].sum = node[temp].sum + 1;
106                     map[edi][edj] = 1;
107                     Q.push(t);
108 
109                     edi = edi + po[i][0];
110                     edj = edj + po[i][1];
111                 }
112             }
113         }
114         if (flag )
115         {
116             cout<<"yes"<<endl;
117         }
118         else 
119         {
120             cout<<"no"<<endl;
121         }
122         
123     }
124     return 0;
125 }

 

转载于:https://www.cnblogs.com/pcpcpc/archive/2012/09/04/2670901.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值