传送门UVa 331 - Mapping the Swaps
用冒泡法步骤肯定是最短的。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int num[10], cnt, n;
bool Judge();
void DFS();
int main()
{
//freopen("input.txt", "r", stdin);
int i, j, cases = 1;
bool flag;
while (scanf("%d", &n) && n)
{
flag = false;
cnt = 0;
for (i = 0; i < n; i++)
scanf("%d", &num[i]);
if (Judge()) //一开始如果就是整齐的,不用DFS了
flag = true;
if (!flag)
DFS();
printf("There are %d swap maps for input data set %d.\n", cnt, cases++);
}
return 0;
}
bool Judge()
{
for (int i = 0; i < n - 1; i++)
if (num[i] > num[i + 1])
return false;
return true;
}
void DFS()
{
for (int i = 0; i < n - 1; i++)
if (num[i] > num[i + 1])
{
swap(num[i], num[i + 1]);
if (Judge())
cnt++;
else
DFS();
swap(num[i], num[i + 1]);
}
}