题目链接:UVa 331 - Mapping the Swaps
最开始做这道题想着是dfs中循环一直向前走,后来想这样不对,因为可能后边交换过后再交换前边的。然后又想双向回溯,也是不对。
再后来发现只要交换前的两个元素是降序排列的,那么这么交换肯定是具有最少交换次数的。这一点题目中也已经隐含了,题目中举了一个例子说明什么样的不是最少次数,这个例子就出现了交换前的两个元素已经是升序排列了,所以交换次数不是最少。
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAX_N = 5 + 2;
int arr[MAX_N];
int n,_count;
void _swap(int i,int j)
{
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
void dfs(bool first)
{
bool flag = true;
for(int i = 0;i < n - 1;i++)
{
if(arr[i] > arr[i + 1])
{
flag = false;
break;
}
}
if(flag && !first)
_count++;
for(int i = 0;i < n - 1;i++)
{
if(arr[i] > arr[i + 1])
{
_swap(i,i + 1);
dfs(false);
_swap(i,i + 1);
}
}
}
int main()
{
int k = 0;
while(cin >> n,n)
{
for(int i = 0;i < n;i++)
cin>>arr[i];
_count = 0;
dfs(true);
cout << "There are " << _count << " swap maps for input data set " << ++k << "." << endl;
}
return 0;
}