/*
使用冒泡排序更好,WA
思路:首先计算出最小移动次数,再进行dfs深搜
思路很重要,有了思路就去实现,如果思路能够得到一些改进更好!
*/
#include <cstdio>
#include <cstring>
int n;
int A[10];
int min;
int ans;
int c[50];
int search()
{
int AA[10];
memcpy(AA,A,sizeof(A));
int i,j;
int count=0;
for(i=1;i<=n;i++)
{
int max=1;
for(j=2;j<=n-i+1;j++)
if(AA[j]>AA[max])
max=j;
int temp=AA[max];
while(max<j-1)
{
count++;
AA[max]=AA[max+1];
max++;
}
AA[max]=temp;
}
return count;
}
void dfs(int cur)
{
if(cur==min+1)
{
int AA[10];
memcpy(AA,A,sizeof(A));
for(int i=1;i<=min;i++)
{
int temp=AA[c[i]];
AA[c[i]]=AA[c[i]+1];
AA[c[i]+1]=temp;
}
int ok=true;
for(int i=1;i<n;i++)
if(AA[i]>AA[i+1])
{
ok=false;
break;
}
if(ok)
ans++;
return;
}
for(int i=1;i<n;i++)
{
c[cur]=i;
dfs(cur+1);
}
}
int main()
{
freopen("data.in","r",stdin);
int cas=1;
while(scanf("%d",&n) && n)
{
for(int i=1;i<=n;i++)
scanf("%d",&A[i]);
min=search();
ans=0;
if(min==0)
printf("There are 0 swap maps for input data set %d.\n",cas++);
else
{
dfs(1);
printf("There are %d swap maps for input data set %d.\n",ans,cas++);
}
}
return 0;
}
/*
AC,思路:题中数据不大,所以可用数组进行状态存储+深搜即可
*/
#include <cstdio>
#include <cstring>
int n;
int ans;
int count;
void dfs(int cur,int *A)
{
if(cur==count)
{
bool ok=true;
for(int i=0;i<n-1;i++)
if(A[i]>A[i+1])
ok=false;
if(ok)
ans++;
return;
}
for(int i=0;i<n-1;i++)
{
int AA[10];
memcpy(AA,A,sizeof(AA));
int a=AA[i];
AA[i]=AA[i+1];
AA[i+1]=a;
dfs(cur+1,AA);
}
}
int main()
{
//freopen("data.in","r",stdin);
int cas=1;
while(scanf("%d",&n) && n)
{
int data[10];
for(int i=0;i<n;i++)
scanf("%d",&data[i]);
count=0;
int temp[10];
memcpy(temp,data,sizeof(data));
for(int i=0;i<n-1;i++)
for(int j=0;j<n-i-1;j++)
{
if(data[j]>data[j+1])
{
count++;
int a=data[j];
data[j]=data[j+1];
data[j+1]=a;
}
}
if(count>0)
{
ans=0;
dfs(0,temp);
printf("There are %d swap maps for input data set %d.\n",ans,cas++);
}
else
printf("There are %d swap maps for input data set %d.\n",0,cas++);
}
return 0;
}