2019河北省大学生程序设计竞赛 L.smart robot(bfs)
Posted live4m
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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). 从1开始枚举ans,数位拆分ans,然后bfs计算是否能组成ans即可,对于每个枚举ans,设数位长度为len,那么单次bfs的复杂度为4len−1.复杂度不太会算,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;
以上是关于2019河北省大学生程序设计竞赛 L.smart robot(bfs)的主要内容,如果未能解决你的问题,请参考以下文章
第 2 届河北省大学生程序设计竞赛(河北省赛)-Problem L. 跑图-题解
第 2 届河北省大学生程序设计竞赛(河北省赛)-Problem H. 神殿-题解
第 2 届河北省大学生程序设计竞赛(河北省赛)-Problem G. 520-题解
第 2 届河北省大学生程序设计竞赛(河北省赛)-Problem K. Bitmap-题解