IDA_star入门题求助
  • 板块题目总版
  • 楼主紊莫turtle
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/12/30 08:28
  • 上次更新2023/10/24 06:10:07
查看原帖
IDA_star入门题求助
443675
紊莫turtle楼主2022/12/30 08:28

题目

思路应该没大问题,可能代码实现错了。

//Author: Velvet on Luogu(uid=443675)
#include <bits/stdc++.h>
using namespace std;

inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
inline void write(int x){if (x < 0) x = ~x + 1, putchar('-');if (x > 9) write(x / 10);putchar(x % 10 + '0');}
inline void writeln(int x){write(x);putchar('\n');}
inline void writesp(int x){write(x);putchar(' ');}
inline int lowbit(int x) {return x&(-x);}
int a[20],n,m,b[20],c[20],ans;
int check(){
	for(int i=1;i<=n;i++)
		if(a[i]!=i) return 0;
	return 1;
}//答案判断
int f(){
	int cnt=0;
	for(int i=2;i<=n;i++)
		cnt+=(a[i]!=a[i-1]+1);
	return (cnt+2)/3;
}//估价函数
void dfs(int dep){
	ans|=check();
	if(dep+f()>m||ans) return ;
	memcpy(c,a,sizeof c); 
	for(int i=1;i<=n;i++){
		for(int j=i;j<=n;j++){
			for(int k=j+1,cnt=0;k<=n;k++){//把i~j的放到k的后面
				for(int l=1;l<=k;l++) if(l<i||l>j)b[++cnt]=a[l];
				for(int l=i;l<=j;l++) b[++cnt]=a[l];
				for(int l=k+1;l<=n;l++) b[++cnt]=a[l];
				memcpy(a,b,sizeof a);
				dfs(dep+1);
				memcpy(a,c,sizeof a);
			}
		}
	}
}
int main(){
	int T;cin>>T;
	while(T--){
		n=read(),ans=0;
		for(int i=1;i<=n;i++)
			cin>>a[i];
		for(m=0;m<=4;m++){
			dfs(1);
			if(ans){
				writeln(m);break;
			}
		}
		if(!ans) printf("5 or more\n");
	}
    return 0;
}

2022/12/30 08:28
加载中...