331 - Mapping the Swaps(回溯+ dfs)
题目:331 - Mapping the Swaps
题目大意:给出一个序列,要求只能相邻的进行交换,求交换次数最少的不同的交换方式有多少种。
解题思路:每次都可以从头选两个需要交换的位置进行交换,(只有前一个的值大于后一个的值才需要交换),选的第一个交换的数的位置不一样,所对应的map也是不一样的。然后这里有可以剪枝的地方:如果在交换的过程中交换的次数已经大于之前的最小的交换次数就可以不用在扩展下去了。注意:如果出现更小的交换次数需要把map的次数改为1.然后扩展需要用到回溯,需要状态的恢复才能产生多种可能。
#include<stdio.h>
#include<algorithm>
using namespace std;const int N = 5;
int t, s[N], count1, min1, order[N];void swap (int i, int j) {int temp = s[i];s[i] = s[j];s[j] = temp;
}bool equal () {bool flag = 1;for (int i = 0; i < t; i++)if (s[i] != order[i]) {flag = 0;break;}return flag;
}void handle (int num) {if (num > min1)return;if (equal()) {if (num == min1)count1++;else if (num < min1) {count1 = 1;min1 = num;}return;}for (int i = 0; i < t - 1; i++) {if ( s[i] > s[i + 1]) {swap(i, i + 1);handle (num + 1);swap(i, i + 1);} }
}int main () {int n = 0;while (scanf("%d", &t), t) {for (int i = 0; i < t; i++) scanf("%d", &s[i]);for (int i = 0; i < t; i++)order[i] = s[i];sort(order, order + t);count1 = 0;if (!equal()) {min1 = 100;handle(0);}
// printf("%d\n", min1);printf("There are %d swap maps for input data set %d.\n", count1, ++n);}return 0;
}
331 - Mapping the Swaps(回溯+ dfs)相关推荐
- UVA 331 Mapping the Swaps
大意:求在最小的交换次数的情况下使得序列升序排列的方案数. 思路:冒泡排序对应最小交换数,然后回溯. CODE: #include <iostream> #include <cstd ...
- UVA Mapping the Swaps
题目例如以下: Mapping the Swaps Sorting an array can be done by swapping certain pairs of adjacent entrie ...
- leetcode 79. Word Search | 79. 单词搜索(回溯+DFS)
题目 https://leetcode.com/problems/word-search/ 题解 回溯 + DFS,回溯是有后效性的,所以不能转化为 DP class Solution {int M; ...
- [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]
[问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...
- Bilibili 笔试扭蛋器----回溯dfs 9.21
当时要上课去...没来得及做编程题...看完题目想了一下觉得不做亏了,有点简单 题目大概是说给一个target数值,从x=0开始,2号可以生成2*x+1,3号生成2*x+2,输出最终能生成target ...
- [Leetcode][第60题][JAVA][第k个排列][回溯][DFS][剪枝]
[问题描述][中等] [解答思路] 1. 回溯搜索算法 + 剪枝 ,直接来到叶子结点 时间复杂度:O(N^2) 空间复杂度:O(N) import java.util.Arrays;public cl ...
- LeetCode 79. 单词搜索(回溯DFS)
1. 题目 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格.同一个 ...
- 组合的输出(回溯dfs)
[题目描述] 排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r≤n),我们可以简单地将n个元素理解为自然数1,2,-,n,从中任取r个数. 现要求你用递归的方法输出所有组 ...
- 递归+回溯+DFS+BFS
计算递归的空间复杂度时,一般都从栈的角度出发,因为每调用一次函数就会占用栈的一个格子,看调用了几次可以看出空间复杂度是多少 递归的核心思想:把规模大的问题转化为规模小的且逻辑相似的子问题来解决 递归三 ...
最新文章
- 设计模式总结——代理模式以及java的动态代理
- 《企业软件交付:敏捷与高效管理精要》——1.5 对企业软件交付的需求是如何演变的呢...
- Struts2的properties配置文件详解
- ActiveMQ的使用
- boost::contract模块实现friend功能的测试程序
- 修改Tomcat编码方式的两种方法
- 在React中处理事件
- 【HDU - 5916】Harmonic Value Description (构造,思维,SJ题)
- Android官方开发文档Training系列课程中文版:APP的内存管理
- oa系统服务器热备份,如何做好OA系统的日常数据备份
- 基于ebpf统计docker容器网络流量
- 苹果7pnfc功能门禁卡_苹果7手机nfc怎么开启 苹果手机门禁卡nfc功能
- Linux内核崩溃转存,Ubuntu 12.04 配置内核崩溃自动重启及转存
- python用for循环求和1到100_python使用for循环计算0-100的整数的和方法
- 检测器backbone和neck哪个更重要,达摩院新作有不一样的答案
- 电脑UEFI启动是什么?
- 愿你熠熠生辉 自成光芒!清微智能祝所有女神节日快乐~
- 杜兰特全部比赛录像合集【百度网盘高清分享】
- 阿衰小冲用计算机,猫小乐:阿衰错把充电电池当成废旧电池扔进回收箱,惹怒小冲了...
- Android OpenGL ES 应用(一)