社区讨论
bfs pts20求助
P1132数字生成游戏参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lwkp0tas
- 此快照首次捕获于
- 2024/05/24 21:03 2 年前
- 此快照最后确认于
- 2024/05/24 22:57 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
struct node{
int num,ans;
};
bool flag[100005];
int s,m,maxLen,nums[15],f[100005];
queue<node> q;
int size(int num){
int len=0;
while(num) num/=10,len++;
return len;
}
void check(int num,node a){
//cout<<(flag[num]==0)<<" "<<a.num<<" "<<num<<" "<<a.ans+1<<endl;
if(flag[num]) return ;
flag[num]=1;
f[num]=a.ans+1;
q.push({num,a.ans+1});
}
void bfs(){
while(q.size()){
node aa=q.front();
q.pop();
int len=0,num=aa.num;
while(num){
nums[len++]=num%10;
num/=10;
}
if(len==1) continue;
for(int i=0;i<len;i++){
for(int j=i+1;j<len;j++){
if(i==j) continue;
//cout<<i<<" "<<j<<" "<<nums[i]<<" "<<nums[j]<<endl;
swap(nums[i],nums[j]);
int num_=0;
for(int k=len-1;k>=0;k--){
num_=num_*10+nums[k];
}
swap(nums[i],nums[j]);
check(num_,aa);
}
}
for(int i=0;i<len;i++){
int num_=0;
for(int k=len-1;k>=0;k--){
if(k!=i) num_=num_*10+nums[k];
}
check(num_,aa);
}
if(len>=maxLen) continue;
for(int i=0;i<len-1;i++){
for(int j=nums[i+1]-1;j>=nums[i];j--){
int num_=0;
for(int k=len-1;k>=0;k--){
//cout<<" "<<(k==i)<<" "<<j<<endl;
if(k==i) num_=num_*10+j;
num_=num_*10+nums[k];
//cout<<num_<<endl;
}
check(num_,aa);
}
}
}
}
int main(){
cin>>s>>m;
flag[s]=1;
maxLen=size(s);
q.push({s,0});
bfs();
while(m--){
cin>>s;
if(flag[s]) cout<<f[s]<<endl;
else cout<<-1<<endl;
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...