zoukankan      html  css  js  c++  java
  • UVa 1600 Patrol Robot【BFS】

    题意:给出一个n*m的矩阵,1代表墙,0代表空地,不能连续k次穿过墙,求从起点到达终点的最短路的长度

    给vis数组再加一维状态,表示当前还剩下的能够穿越的墙的次数,每次碰到墙,当前的k减去1,碰到0,当前的k变成最初的k

    学习的这一篇

    http://www.cnblogs.com/bingolibing/p/3873822.html

     1 #include<iostream>  
     2 #include<cstdio>  
     3 #include<cstring> 
     4 #include <cmath> 
     5 #include<stack>
     6 #include<vector>
     7 #include<map> 
     8 #include<set>
     9 #include<queue> 
    10 #include<algorithm>  
    11 using namespace std;
    12 
    13 #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)
    14 
    15 typedef long long LL;
    16 const int INF = (1<<30)-1;
    17 const int mod=1000000007;
    18 const int maxn=105;
    19 
    20 int g[maxn][maxn];
    21 int vis[25][25][25];
    22 int n,m,k,ans;
    23 int dir[4][2]={1,0,-1,0,0,1,0,-1};
    24 
    25 struct node{
    26     int x,y;
    27     int step;
    28     int k;
    29 };
    30 
    31 void bfs(){
    32     node u;
    33     u.x=1;u.y=1;u.step=0;u.k=k;
    34     queue<node> q;
    35     vis[1][1][k]=1;
    36     q.push(u);
    37     
    38     while(!q.empty()){
    39         u=q.front();q.pop();
    40         if(u.x==n&&u.y==m){
    41             ans=u.step;
    42             return;
    43         }
    44                 
    45         node v;
    46         if(u.k>=0){
    47             for(int i=0;i<4;i++){
    48                 v.x=u.x+dir[i][0];
    49                 v.y=u.y+dir[i][1];
    50                 v.step=u.step+1;
    51                 
    52                 if(g[v.x][v.y]) v.k=u.k-1;
    53                 else v.k=k;
    54                 if(v.x>=1&&v.x<=n&&v.y>=1&&v.y<=m&&!vis[v.x][v.y][v.k]){
    55                     if(v.k>=0){
    56                         vis[v.x][v.y][v.k]=1;
    57                         q.push(v);    
    58                     }
    59                     
    60                 }                            
    61             }
    62         }
    63     }
    64 }
    65 
    66 int main(){
    67     int T;
    68     scanf("%d",&T);
    69     for(int t=1;t<=T;t++){
    70         memset(g,0,sizeof(g));
    71         memset(vis,0,sizeof(vis));
    72         cin>>n>>m>>k;
    73         
    74         for(int i=1;i<=n;i++)
    75          for(int j=1;j<=m;j++)
    76          cin>>g[i][j];
    77          
    78          ans=-1;
    79          bfs();
    80          cout<<ans<<"
    ";
    81     }
    82     return 0;
    83 }
    View Code

    因为for循环里面的<符号写成逗号,改了好久好久---

  • 相关阅读:
    STL中的stack(堆栈)
    单链表的创建与删除
    面试题四 从尾到头打印链表
    第 1 章 第 2 题 空间敏感排序问题 位向量实现( bitset位向量 )
    第 1 章 第 2 题 位向量的数组实现问题 位运算实现
    第 1 章 第 1 题 高级语言的排序问题 C++标准算法实现
    面试题三 替换空格
    面试题二 二维数组中的查找
    面试题一 赋值运算符函数
    不为客户连接创建子进程的并发回射服务器( poll实现 )
  • 原文地址:https://www.cnblogs.com/wuyuewoniu/p/4465732.html
Copyright © 2011-2022 走看看