UVA 1600-- Patrol Robot (bfs)

来源:互联网 发布:淘宝店铺权重是什么 编辑:程序博客网 时间:2024/06/02 03:57


这题。。 开始把题目看错了,k表示最大连续数,机器人最多连续通过k个障碍

然后开始写,wa掉了

一直wa 改不成功,这个的状态存储有点问题,对于连续障碍的更新有问题,并且有些障碍的位置不能只存储一次,存储一次会错的

想不出来这种方法怎么修正,用一个dd[][] 去存储状态 当遇到下一个点为0是dd应该复原,但是值得注意的是,在for循环内部,dd应该是不变的,只是对应状态改变


所以二维我不知道怎么改了,看来只好用三维的 带障碍数;


错误代码

#include <iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<queue>using namespace std;const int maxn=25;int n,m;int mp[maxn][maxn];int vis[maxn][maxn];int d[maxn][maxn];int k;int dx[]={1,0,-1,0};int dy[]={0,1,0,-1};int dd[maxn][maxn];int dfs(){    memset(d,0xff,sizeof(d));    memset(dd,0xff,sizeof(dd));    queue<pair<int,int> > q;    q.push(make_pair(0,0));    d[0][0]=0;    while(q.size())    {        pair<int,int> a=q.front();        q.pop();        if(a.first==n-1&&a.second==m-1)        {            return d[a.first][a.second];        }        for(int i=0;i<4;i++)        {            int xx=dx[i]+a.first,yy=dy[i]+a.second;            if(xx>=0&&xx<n&&yy>=0&&yy<m&&d[xx][yy]<0&&!mp[xx][yy])            {                d[xx][yy]=d[a.first][a.second]+1;                q.push(make_pair(xx,yy));                dd[a.first][a.second]=-1;                //cout<<"push1"<<endl;            }             else if(xx>=0&&xx<n&&yy>=0&&yy<m&&mp[xx][yy]&&dd[a.first][a.second]+1<k)            {                //cout<<"? "<<a.first<<" "<<a.second<<"dd   a"<<dd[a.first][a.second]<<endl;               // cout<<"? "<<a.first<<" "<<a.second<<endl;              //  cout<<xx<<" "<<yy<<endl;999999809-               if(d[xx][yy]<0)                q.push(make_pair(xx,yy));                if(d[xx][yy]<0||d[xx][yy]>d[a.first][a.second]+1)                d[xx][yy]=d[a.first][a.second]+1;                if(dd[xx][yy]<0||dd[xx][yy]>dd[a.first][a.second]+1)                dd[xx][yy]=dd[a.first][a.second]+1;                // cout<<"push2"<<endl;            }        }    }    return -1;}int main(){    //freopen("out.txt","w",stdout);    int T;    cin>>T;    while(T--)    {         cin>>n>>m>>k;         memset(vis,0,sizeof(vis));         memset(mp,0,sizeof(mp));         for(int i=0;i<n;i++)             for(int j=0;j<m;j++)                cin>>mp[i][j];        int ans=dfs();        cout<<ans<<endl;    }    return 0;}
更新的等会写。。

我又gg了  ,身体是革命的本钱,身体不好的人,简直无能为力,头疼到没法敲代码,卧槽强撑撑住啊,下午还要打选拔赛呢,要是不能出线,那就等着gg吧!!!!


正确代码:网上的(懒人找借口,等会敲)

#include <stdio.h> #include <string.h>#include <queue>using namespace std;int g[32][32];int dist[32][32][32];const int dx[] = {0, 0, 1, -1};const int dy[] = {1, -1, 0, 0};int main() {    int testcase;    int N, M, K;    scanf("%d", &testcase);    while (testcase--) {        scanf("%d %d %d", &N, &M, &K);        for (int i = 0; i < N; i++)            for (int j = 0; j < M; j++)                scanf("%d", &g[i][j]);        memset(dist, 63, sizeof(dist));        dist[0][0][0] = 0;        queue<int> X, Y, S;        int x, y, s, tx, ty, ts;        X.push(0), Y.push(0), S.push(0);        while (!X.empty()) {            x = X.front(), X.pop();            y = Y.front(), Y.pop();            s = S.front(), S.pop();            for (int i = 0; i < 4; i++) {                tx = x + dx[i], ty = y + dy[i];                if (tx < 0 || ty < 0 || tx >= N || ty >= M)                    continue;                if (g[tx][ty])                    ts = s + 1;                else                    ts = 0;                if (ts > K)continue;                if (dist[tx][ty][ts] > dist[x][y][s] + 1) {                    dist[tx][ty][ts] = dist[x][y][s] + 1;                    X.push(tx), Y.push(ty), S.push(ts);                }            }        }        int ret = 0x3f3f3f3f;        for (int i = 0; i <= K; i++)            ret = min(ret, dist[N-1][M-1][i]);        printf("%d\n", ret == 0x3f3f3f3f ? -1 : ret);    }    return 0;}


原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 企业被列入经营税务异常名录怎么办 手机号被别人绑定了企业微信怎么办 刚出生一天的婴儿不肯吃奶怎么办 9个月孩子不好好吃奶怎么办 孩子2个月吃奶老是呛到怎么办 孩子4个月不好好吃奶怎么办? 3个月的孩子不吃奶肚子胀怎么办 刚出生的婴儿吃完奶打嗝怎么办 宝宝刚生下来一直睡觉不吃奶怎么办 刚生下来的婴儿不吃奶怎么办 刚生下来的小猫不吃奶怎么办 刚生的小羊羔不吃奶怎么办 刚出生的婴儿不会吸奶怎么办 生完小孩七十天妈妈咳嗽怎么办 带欣的名字三个字儿的怎么办 二十多岁的儿子沉迷游戏网络怎么办 为什么打开游戏网络却用不了怎么办 打来微信网页版显示证书错误怎么办 开了家定制家具店生意不好怎么办 宝宝起风疹怎么办要注意的问题 超市买的内裤西铁牌子没去掉怎么办 没申请生产许可证贴标了怎么办 淘宝没有品牌非要我写品牌怎么办没 意外怀孕明明一直用安全套的怎么办 找不到百度网盘的dns地址怎么办 小米众筹到了发货时间不发货怎么办 不知道电脑宽带连接账号密码怎么办 电脑如果宽带账号密码忘记了怎么办 xp电脑用户名和密码忘了怎么办 电脑的用户名和密码忘记了怎么办 电脑重置后需要用户名和密码怎么办 电脑登录用户名和密码忘记了怎么办 电脑登录用户名和密码忘了怎么办啊 微信无意中点了允许登录怎么办 qq号码登录微信无法验证怎么办 注册微信公众号邮箱激活不了怎么办 不是自己申请的qq号忘密码怎么办 联通宽带拨号账号密码忘记了怎么办 忘了路由器的用户名和密码怎么办 宽带连接用户名和密码忘了怎么办 江西银行网银用户名忘记了怎么办