社区讨论

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 条回复,欢迎继续交流。

正在加载回复...