讲道理,这都能A我也是醉了。。。
题目就是给你一串序列 然后要你给这个序列排序(排序方式是两两交换)
一个是要算出最少的交换步数
另一个是在步数最少的情况下求出有几种交换方式
递归暴力
#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
int con[10];
int num;
int bestnum;
void swap(int x,int y){
int temp = con[x];
con[x] = con[y];
con[y] = temp;
}
void dfs(int cur,int n){
bool flag = true;
for (int i = 0; i < n - 1; i++){
if (con[i]>con[i + 1]){
flag = false;
swap(i,i+1);
dfs(cur + 1, n);
swap(i + 1, i);//看上一步 如果递归的结果不太对,那就换回来,继续下一个
}
}
if (flag){
if (cur < bestnum&&cur){
bestnum = cur;
num = 1;
}
else if (cur == bestnum)
num++;
}
}
int main(){
int n,t=1;
while (scanf_s("%d", &n) && n){
for (int i = 0; i < n; i++)
cin >> con[i];
num = 0;
bestnum = 999999;
dfs(0, n);
printf("There are %d swap maps for input data set %d.\n",num,t++);
}
return 0;
}