思路:深度代表到达的小区编号,每一个小区都有走a,走b两种选择,走a一定先于走b,因为要确保输出的是最小字典序,在搜索的过程中,如果搜索到了一个曾经访问过的小区,那么一定就陷入了死循环,flag标记为1,为了模拟进入死循环的情况,如果在返回的过程中发现有一个小区曾经访问过,那么当前状态的字符串一定是无限长的。
#include<bits/stdc++.h>
using namespace std;
int n;
const int M=1e5+5;
int a[M];
int b[M];
int vis[M];
int f[M];
int flag;
char ans[M];
int dfs(int dep,int step){
if(dep<1||dep>n){
return 0;
}
if(dep==n){
ans[step]='\0';
return 1;
}
if(vis[dep]){
f[dep]=1;
return 0;
}
vis[dep]=1;
if(dfs(dep+a[dep],step+1)){
ans[step]='a';
if(f[dep]) flag=1;
return true;
}
if(dfs(dep+b[dep],step+1)){
ans[step]='b';
if(f[dep]) flag=1;
return true;
}
return false;
}
int main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
if(dfs(1,0)){
if(flag) cout<<"Infinity!"<<endl;
else cout<<ans<<endl;
}
else cout<<"No solution!"<<endl;
return 0;
}