社区讨论
0分求调
P1132数字生成游戏参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhz490dk
- 此快照首次捕获于
- 2025/11/15 01:12 4 个月前
- 此快照最后确认于
- 2025/11/16 13:47 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
queue<int> q;
int step[N];
int s,t,m;
int num[N],cnt;
bool v[N];
void f(int x){
while(x){
num[cnt++]=x%10;
x/=10;
}
}
void s1(int x){
int n=0;
for(int i=0;i<cnt;i++){
for(int j=i+1;j<cnt;j++){
swap(num[i],num[j]);
for(int k=0;k<cnt;k++){
n=n*10+num[k];
}
if(!v[n]){
q.push(n);
step[n]=step[x]+1;
v[n]=true;
}
swap(num[j],num[i]);
}
}
}
void s2(int x){
int n=0;
for(int i=0;i<cnt;i++){
for(int j=0;j<cnt;j++){
if(j!=i) n=n*10+num[j];
if(!v[n]){
q.push(n);
step[n]=step[x]+1;
v[n]=true;
}
}
}
}
void s3(int x){
int n=0;
for(int i=1;i<cnt;i++){
for(int j=num[i]+1;j<num[i+1];j++){
for(int k=0;k<cnt;k++){
if(k==i){
n=n*10+j;
}
n=n*10+num[k];
}
if(!v[n]){
q.push(n);
step[n]=step[x]+1;
v[n]=true;
}
}
}
}
int bfs(){
q.push(s);
memset(step,-1,sizeof step);
memset(v,false,sizeof v);
step[s]=0;
while(!q.empty()){
cnt=0;
int x=q.front();
q.pop();
f(x);
s1(x);
s2(x);
s3(x);
}
return step[m];
}
int main(){
cin>>s;
cin>>t;
while(t--){
cin>>m;
cout<<bfs()<<endl;
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...