6-5 巡逻机器人 uva1600

一开始按照标准bfs来写  标记为二维数组

后来按照三维数组写过了    ps大部分bfs都不会是二维数组搞定!!!

其中有一个bug弄了半个小时。。。

一开始我是先判断!vis【x】【y】【v.c】 再判断方块是否为1  是的话v.c++;否的话归零  

但是 这并不科学   到另外一个方块的时候    如果数组下标内容和结构体有关的话  应该先改变状态再判断   就如同肯定是先在u的基础上改变dx dy  再判断v.x v.y  一个道理  不然会超时!因为头不对尾

#include<bits/stdc++.h>
using namespace std;

int m1[25][25];int n,m,chance;
bool vis[25][25][25];
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
struct  node
{
    int x,y,d,c;
    node(int x=0,int y=0,int d=0,int c=0):x(x),y(y),d(d),c(c){}
};

bool inmap(int x,int y)
{
    if(x>=1&&x<=n&&y>=1&&y<=m)return true;
    return false;

}

void bfs()
{   memset(vis,false,sizeof(vis));
    node u(1,1,0,0);
    queue<node>q;
    q.push(u);
    vis[1][1][0]=true;
    while(!q.empty())
    {
       u=q.front();q.pop();

       if(u.x==n&&u.y==m){printf("%d\n",u.d);return;}
       for(int i=0;i<4;i++)
       {
           node v(u.x+dx[i],u.y+dy[i],u.d+1,u.c);


           if(m1[v.x][v.y])
            v.c++;
           else v.c=0;
           if(v.c<=chance&&!vis[v.x][v.y][v.c]&&inmap(v.x,v.y))
           {
               vis[v.x][v.y][v.c]=true;

               q.push(v);

           }

       }
    }
    printf("-1\n");
    return ;

}

int main()
{
    int cas;cin>>cas;
    while(cas--)
    {
        scanf("%d %d %d",&n,&m,&chance);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
              scanf("%d",&m1[i][j]);

         bfs();

    }

}
View Code

猜你喜欢

转载自www.cnblogs.com/bxd123/p/10317740.html