zoukankan      html  css  js  c++  java
  • 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;
    }
    }
  • 相关阅读:
    查找整数
    寒假作业3
    寒假作业2
    寒假作业1
    秋季学期总结
    对自己影响最深的三位老师
    自我介绍
    jquery学习笔记
    素材网站
    转:vim模式下报错E37: No write since last change (add ! to override)
  • 原文地址:https://www.cnblogs.com/137033036-wjl/p/4890027.html
Copyright © 2011-2022 走看看