记录编号 |
38386 |
评测结果 |
AAWWWWWWWW |
题目名称 |
排序 |
最终得分 |
20 |
用户昵称 |
Makazeu |
是否通过 |
未通过 |
代码语言 |
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;
}