先算出最小交换次数,再枚举交换方案,如3 2 1中,最小交换次数为逆序数3,则共有(len-1)^3种交换方案,如 000、010、101、111 (从0开始数,A0)
交换次数为0,则需特殊处理!
#include<stdio.h>
#include<string.h>
int in[6];
int len;
int numsp;
int count;
void swap(int cur,int numsp,int* arr)
{
if(cur == numsp)
{
int ok = 1;
for(int i = 0; i < len-1; i++)
{
if(arr[i]>arr[i+1])
ok = 0;
}
if(ok)
count++;
return;
}
for(int i = 0; i < len-1; i++)
{
if(arr[i]>arr[i+1]) //否则,交换是多余的,一定不是最小交换次数
{
int t = arr[i];
arr[i] = arr[i+1];
arr[i+1] = t;
swap(cur+1,numsp,arr);
t = arr[i];
arr[i] = arr[i+1];
arr[i+1] = t;
}
}
}
int main()
{
//
int numcase = 1;
freopen("input.txt","r",stdin);
while(scanf("%d",&len)==1 && len)
{
numsp = 0;
count = 0;
for(int i = 0; i < len;i++)
{
scanf("%d",in+i);
}
for(int i = 0; i < len;i++)
{
for(int j = i+1; j < len;j++)
if(in[i] > in[j])
numsp++;
}
if(numsp ==0) count=0;
else swap(0,numsp,in);
printf("There are %d swap maps for input data set %d.\n",count,numcase++);
}
}
//2017.9.16
#include<stdio.h> #include<string.h> int len; int arr[10]; int used[10]; int minswap; int sol; void swap(int* a, int i, int j) { int t = a[i]; a[i] = a[j]; a[j]= t; } void dfs(int cnt) { if(cnt == minswap) { bool ok = true; for(int i = 0; i+1 < len; ++i) { if(arr[i] > arr[i+1]) { ok = false; break; } } if(ok) sol++; return; } for(int i = 0; i+1 < len; ++i) { if(arr[i] > arr[i+1]) { swap(arr, i, i+1); dfs(cnt+1); swap(arr, i, i+1); } } } int main() { freopen("input.txt", "r", stdin); int numcase = 0; while(scanf("%d", &len) == 1) { if(!len) break; numcase++; sol = 0; minswap = 0; for(int i = 0; i < len; ++i) { scanf("%d", &arr[i]); for(int j = 0; j < i; ++j) { if(arr[j] > arr[i]) { minswap++; } } } if(!minswap) { printf("There are %d swap maps for input data set %d.\n", 0, numcase); continue; } memset(used, 0, sizeof(used)); dfs(0); printf("There are %d swap maps for input data set %d.\n", sol, numcase); } }