社区讨论
MnZn 20pts求助,不知道哪里出问题了
P1139单向双轨道参与者 1已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @m2lw9h55
- 此快照首次捕获于
- 2024/10/23 21:12 去年
- 此快照最后确认于
- 2025/11/04 16:24 4 个月前
C
#include<bits/stdc++.h>
using namespace std;
const int N = 16;
int n,vis[N];
char s[N];
int mp[N],pos[N],id[N],f[N],t[N],ans=1e9,ANSF[N],ANST[N],ANSID[N],stk[N][3],tp,tp2,tp3;
void dfs(int cnt,int num){
if((cnt-1)>ans){
return;
}
if(num==n){
if((cnt-1)<ans){
ans=cnt-1;
for(int i=1;i<=cnt-1;i++){
ANSF[i]=f[i];
ANST[i]=t[i];
ANSID[i]=id[i];
}
}
return;
}
for(int i=0;i<n;i++){
for(int j=0;j<=3;j++){
if(pos[i]>=j) continue;
if(j==3&&num+1!=mp[i]) continue;
if(pos[i]==0){
if(stk[tp][0]!=i) continue;
}
if(pos[i]==1){
if(stk[tp2][1]!=i) continue;
}
if(pos[i]==2){
if(stk[tp3][2]!=i) continue;
}
//cout<<char(i+'a')<<" "<<char(pos[i]+'A')<<" "<<char(j+'A')<<" "<<cnt<<endl;
f[cnt]=pos[i];
t[cnt]=j;
id[cnt]=i;
int tmp=pos[i];
pos[i]=j;
if(j==1){
stk[++tp2][1]=i;
tp--;
dfs(cnt+1,num);
pos[i]=tmp;
tp2--;
tp++;
}
else if(j==2){
stk[++tp3][2]=i;
if(tmp==0){
tp--;
}
else tp2--;
dfs(cnt+1,num);
pos[i]=tmp;
if(tmp==0){
tp++;
}
else tp2++;
tp3--;
}
else if(j==3){
if(tmp==0){
tp--;
}
else if(tmp==1){
tp2--;
}
else if(tmp==2){
tp3--;
}
dfs(cnt+1,num+1);
pos[i]=tmp;
if(tmp==0){
tp++;
}
else if(tmp==1){
tp2++;
}
else if(tmp==2){
tp3++;
}
}
}
}
}
int main(){
//freopen("P1139.in","r",stdin);
//freopen("P1139.out","w",stdout);
cin>>n;
//cout<<n<<endl;
for(int i=1;i<=n;i++){
cin>>s[i];
mp[s[i]-'a']=n-i+1;
}
for(int i=0;i<=n-1;i++){
stk[++tp][0]=i;
}
dfs(1,0);
if(ans==1e9) cout<<"NO"<<endl;
else{
//cout<<ans<<endl;
for(int i=1;i<=ans;i++){
cout<<char(ANSID[i]+'a')<<" "<<char(ANSF[i]+'A')<<" "<<char(ANST[i]+'A')<<endl;
}
}
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...