记录编号 38386 评测结果 AAWWWWWWWW
题目名称 排序 最终得分 20
用户昵称 GravatarMakazeu 是否通过 未通过
代码语言 C++ 运行时间 0.003 s
提交时间 2012-04-18 11:58:29 内存使用 0.26 MiB
显示代码纯文本
#include <cstdio>
#include <queue>
#include <cstdlib>
#include <vector>
#include <set>
using namespace std;
const int MAXN=25;
int N;
class QUEUE
{
public:
	vector<int> oper;
	int num[MAXN];
	int step;
}nxt,tmp;
queue<QUEUE> Q;

class Hash {public: int num[MAXN];}th;
class cmp
{
public:
	bool operator() (const Hash&a,const Hash&b)
	{
		for(int i=1;i<=N;i++)
			if(a.num[i]!=b.num[i]) return a.num[i]<b.num[i];
		return 1;
	}
};
set<Hash,cmp> hash;

bool check(QUEUE x)
{
	for(int i=1;i<=N;i++)  th.num[i]=x.num[i];
	if(hash.find(th)==hash.end()) {hash.insert(th); return 1;}
	return 0;
}

void bfs()
{
	while(!Q.empty())
	{
		tmp=Q.front(); Q.pop();
		for(int i=1;i<=N;i++)
		{
			nxt=tmp;
			for(int j=1;j<=i;j++) nxt.num[j]=tmp.num[i-j+1];
			if(!check(nxt));
			nxt.oper.push_back(i);
			nxt.step++;
			bool flag=0;
			for(int i=2;i<=N;i++)
				if(nxt.num[i]<nxt.num[i-1]) {flag=1;break;}
			if(!flag)
			{
				printf("%d\n",nxt.step);
				for(unsigned int k=0;k<nxt.oper.size();k++)
					printf("%d ",nxt.oper[k]);
			}
		}
	}
}

void init()
{
	scanf("%d\n",&N);
	for(int i=1;i<=N;i++) scanf("%d\n",&tmp.num[i]),th.num[i]=tmp.num[i];
	tmp.step=0; tmp.oper.clear(); th.num[0]=0;  hash.insert(th); bool flag=0;
	for(int i=2;i<=N;i++) if(tmp.num[i]<tmp.num[i-1]) {flag=1; break;}
	if(!flag) {printf("0\n"); exit(0);} Q.push(tmp);
}

int main()
{
	freopen("sorta.in","r",stdin);
	freopen("sorta.out","w",stdout);
	init();
	bfs();
	return 0;
}