zoukankan      html  css  js  c++  java
  • UVa1600,Patrol Robot

    带状态的bfs

    不是1A过的T T ,一开始TLE,改了下后WA...后来把访问状态数组改成了3维的,加了个维是当前的命条数

    仍是bfs模板题,加了一维状态而已,没啥难度

    自己注意一定注意vis不要丢维度...

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    #define maxn 20+5
    using namespace std;
    int map[maxn][maxn],vis[maxn][maxn][maxn];
    int m,n,k,ans;
    int dx[]={0,0,1,-1};
    int dy[]={1,-1,0,0};
    struct Node{
        int x,y;
        int cnt;
        int k;
    };
    int init(){
        memset(map,0,sizeof(map));
        memset(vis,0,sizeof(vis));
        cin>>n>>m>>k;
        for (int i=0;i<n;i++)
            for (int j=0;j<m;j++)
                cin>>map[i][j];
    }
    int bfs(){
        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 0;
            }
            Node v;
            if (u.k>=0)//如果到该点没有命了, 那么就不需要在该点扩展了 
            for (int i=0;i<4;i++){
                v.x=u.x+dx[i];
                v.y=u.y+dy[i];
                v.cnt=u.cnt+1;
                if (map[v.x][v.y]) v.k=u.k-1;
                        else v.k=k;//碰到0就恢复满命 
                if (v.x>=0&&v.x<n&&v.y>=0&&v.y<m&&!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;
        cin>>T;
        while (T--){
            init();
            bfs();
            cout<<ans<<endl;
        }
    }
    View Code
  • 相关阅读:
    C# 多线程编程及其几种方式
    多态有几种表现形式
    闭包的理解
    C# 泛型类型约束 where
    HTML扩展--HTMLTestRuner HTML测试报告
    编写web自动化测试
    unittest单元测试框架之认识unittest
    自动化测试模型
    处理HTML5视频播放、滑动解锁
    操作Cookie调用JavaScript
  • 原文地址:https://www.cnblogs.com/acbingo/p/3873822.html
Copyright © 2011-2022 走看看