2019河北省大学生程序设计竞赛 L.smart robot(bfs)

题意:

在这里插入图片描述

解法:

从 1 开 始 枚 举 a n s , 数 位 拆 分 a n s , 然 后 b f s 计 算 是 否 能 组 成 a n s 即 可 , 对 于 每 个 枚 举 a n s , 设 数 位 长 度 为 l e n , 那 么 单 次 b f s 的 复 杂 度 为 4 l e n − 1 . 复 杂 度 不 太 会 算 , O ( a c ) . 从1开始枚举ans,数位拆分ans,然后bfs计算是否能组成ans即可,\\ 对于每个枚举ans,设数位长度为len,那么单次bfs的复杂度为4^{len-1}.\\ 复杂度不太会算,O(ac). 1ans,ans,bfsans,ans,len,bfs4len1.,O(ac).

code:
#include <bits/stdc++.h>
using namespace std;
const int maxm=2e5+5;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
int mark[55][55][55];
int a[55][55];
int digit[55];
int n;
struct Node{
    int i,j,k;
};
bool bfs(int p){
    int len=0;
    while(p){
        digit[++len]=p%10;
        p/=10;
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            for(int k=1;k<=len;k++){
                mark[i][j][k]=0;
            }
        }
    }
    queue<Node>q;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(a[i][j]==digit[len]){
                if(len==1)return 1;
                mark[i][j][len]=1;
                q.push({i,j,len});
            }
        }
    }
    while(q.size()){
        Node t=q.front();q.pop();
        int x=t.i,y=t.j,z=t.k;
        for(int k=0;k<4;k++){
            int xx=x+dx[k];
            int yy=y+dy[k];
            if(xx<=0||xx>n||yy<=0||yy>n)continue;
            if(mark[xx][yy][z-1])continue;
            if(a[xx][yy]==digit[z-1]){
                if(z-1==1)return 1;
                mark[xx][yy][z-1]=1;
                q.push({xx,yy,z-1});
            }
        }
    }
    return 0;
}
void solve(){
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>a[i][j];
        }
    }
    for(int k=1;;k++){
        if(!bfs(k)){
            cout<<k<<endl;
            return ;
        }
    }
}
signed main(){
    ios::sync_with_stdio(0);
    solve();
    return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值