首页 > 代码库 > UVa1600,Patrol Robot

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+5using 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