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

 

posted @ 2014-07-28 19:09  ACBingo  阅读(821)  评论(0编辑  收藏  举报