题意:
解法:
从 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;
}