uva 331(回溯)

来源:互联网 发布:淘宝是谁的创始人 编辑:程序博客网 时间:2024/05/22 06:33

题意:给出n个数字,判断让相邻的两个数交换,最后形成从小到大的序列的次数最少的交换方案有几种。

题解:判断如果顺序不是从小到大就开始递归,从开头进行相邻的两个数交换,每交换形成一个从小到大的序列后,就将交换过的再还原,方案加一,然后继续从下一个数字开始交换,直到递归结束。

#include <stdio.h>const int N = 10;int n, s[N], ans;int judge() {for (int i = 0; i < n - 1; i++)if (s[i] > s[i + 1])return 0;return 1;}void swap(int pos1, int pos2) {int temp;temp = s[pos1];s[pos1] = s[pos2];s[pos2] = temp;}void dfs() {if (judge()) {ans++;return;}for (int i = 0; i < n - 1; i++)if (s[i] > s[i + 1]) {swap(i, i + 1);dfs();swap(i, i + 1);}}int main() {int t = 1;while (scanf("%d", &n) && n) {ans = 0;for (int i = 0; i < n; i++)scanf("%d", &s[i]);if (!judge())dfs();printf("There are %d swap maps for input data set %d.\n", ans, t++);}return 0;}


0 0