UVA1600 Patrol Robot

题意:

  求机器人走最短路线,而且可以穿越障碍。N代表有N行,M代表最多能一次跨过多少个障碍。

分析:

    bfs()搜索,把访问状态数组改成了3维的,加了个维是当前能跨过的障碍数。

代码:

  

#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <queue>using namespace std;struct node{    int x,y,cnt,k;
};int m,n,k,map[25][25];int vis[25][25][25];int ans;int dis[4][2]={{-1,0},{0,1},{1,0},{0,-1}};void bfs(){    int i,j;    queue<node>q;    node u;    u.x=0;u.y=0;u.cnt=0;u.k=k;    vis[0][0][k]=1;    q.push(u);    while(!q.empty())    {        u=q.front();        q.pop();        if(u.x==n-1&&u.y==m-1)        {            ans=u.cnt;            return;        }        node v;        if(u.k>=0)        {            for(i=0;i<4;i++)            {                v.x=u.x+dis[i][0];                v.y=u.y+dis[i][1];                v.cnt=u.cnt+1;                if(map[v.x][v.y])                    v.k=u.k-1;                else                    v.k=k;                if(v.y>=0&&v.y<m&&v.x<n&&v.x>=0&&!vis[v.x][v.y][v.k])                {                    if(v.k>=0)                    {                        q.push(v);                        vis[v.x][v.y][v.k]=1;                    }                }            }        }    }    if (q.empty())        ans=-1;}int main(){    int T;    scanf("%d",&T);    int i,j;    while(T--)    {        memset(map,0,sizeof(map));        memset(vis,0,sizeof(vis));        cin>>n>>m>>k;        for(i=0;i<n;i++)            for(j=0;j<m;j++)                cin>>map[i][j];        bfs();        cout<<ans<<endl;    }
}
时间: 2024-11-05 22:53:28

UVA1600 Patrol Robot的相关文章

UVa1600 Patrol Robot (最短路)

链接:http://acm.hust.edu.cn/vjudge/problem/49764分析:多了一个不能连续穿过k个障碍物的限制条件,那么就在状态中增加一个表示已连续穿过cnt个障碍物的描述,vis也要增加一维变成vis[x][y][cnt],毕竟vis用来记录当前状态是否曾经已经出现过.碰到障碍物且拿来扩展的状态cnt小于等于k就将cnt++,否则遇到空地就将cnt清零. 1 #include <cstdio> 2 #include <queue> 3 #include &

UVA 1600 Patrol Robot(BFS扩展)

Patrol Robot Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description A robot has to patrol around a rectangular area which is in a form of mxn grid (m rows and n columns). The rows are labeled from 1 to m.

UVA 1600 Patrol Robot

带状态的bfs 用一个数(ks)来表示状态-当前连续穿越的障碍数: step表示当前走过的步数: visit数组也加一个状态: 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <queue> 5 using namespace std; 6 7 const int maxn = 30 ; 8 9 struct node { 10 int x,y; 11 int

UVA 1600 Patrol Robot(机器人穿越障碍最短路线BFS)

UVA 1600 Patrol Robot Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Description A robot has to patrol around a rectangular area which is in a form of mxn grid (m rows and n columns). The rows are labeled from 1 to m. The colu

Patrol Robot UVa1600巡逻机器人

题意大概: 机器人要从一个m*n(m和n的范围都在1到20的闭区间内)的网格的左上角(1,1)走到右下角(m,n).网格中的一些格子是空地,用0表示,其它格子是障碍,用1表示.机器人每次可以往四个方向走一格,但不能连续地穿越k( [0,20] )个障碍,求最短路长度.起点和终点保证是空地. 思路:用bfs搜索即可,由于不能连续地穿越k个障碍,所以在原本的vis2维数组上面再添加1维,变成3维数组,表示穿越的墙的层数(障碍). 代码如下: #include<cstdio> #include<

UVA 1600 Patrol Robot(机器人穿越障碍最短路线BFS) 解题心得

原题: Description A robot has to patrol around a rectangular area which is in a form of mxn grid (m rows and n columns). The rows are labeled from 1 to m. The columns are labeled from 1 to n. A cell (i, j) denotes the cell in row i and column j in the

Patrol Robot UVA - 1600

题意:给一个矩阵,从(1,1)走到(m,n)的最短路,"1"是障碍,不能连续穿过k个障碍. WA了16次,花费了一个上午和半个下午...想?? 每个点的属性至少是3维,比如每个点带有的已经连续穿过障碍的次数,再把跑过的步长算上,就四维了,所以最好用一个结构体! AC代码: 1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5

Uva 1600 Patrol Robot (BFS 最短路/DFS剪枝)

这道题运用的知识点是求最短路的算法.一种方法是利用BFS来求最短路. 需要注意的是,我们要用一个三维数组来表示此状态是否访问过,而不是三维数组.因为相同的坐标可以通过不同的穿墙方式到达. #include <bits/stdc++.h> using namespace std; struct Node{ int r; int c; int g; int cnt; Node(int r,int c,int g,int cnt):r(r),c(c),g(g),cnt(cnt){} }; int v

UVa 1600 Patrol Robot (习题 6-5)

传送门: https://uva.onlinejudge.org/external/16/1600.pdf 多状态广搜 网上题解: 给vis数组再加一维状态,表示当前还剩下的能够穿越的墙的次数,每次碰到墙,当前的k减去1,碰到0,当前的k变成最初的k. vis[x][y][z]  x, y代表坐标  z表示k  当为真时说明该点剩余穿墙次数为k的状态已出现过 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 typedef struct