有3n个花盆,红色、蓝色和黄色的各n个。开始时排列的顺序是混乱的,如黄、红、蓝、黄、黄、蓝、黄、红、红……
来源:互联网 发布:智能制造 数据采集 编辑:程序博客网 时间:2024/04/29 00:59
请编写意程序:将各花盆按红、黄、蓝、红、黄、蓝……的顺序排列,而且要求花盆之间的交换次数最少。
分析:交换两个变量A、B的值徐需要交换3次,交换3个变量的值需要交换4次。
实现要点:实现中并不用专门统计交换次数,而是将3n个数据存储在n*3的二维数组空间中,这样第一列应放红花盆、第二列应该放黄花盆、第三列应该放蓝花盆。程序由直接交换(一次直接交换需要交换3次)和循环交换(一次循环交换需要交换4次)两部分组成。
程序中红、黄、蓝花分别用数字1、2、3表示
源代码:
#include <iostream>#include <vector>using namespace std;int main(){ vector<vector<int>> v; vector<int> v_tmp(3); /*cout<<v_tmp.size();*/ int tmp=0; //红、蓝、黄色的花各n个 int n; //总交换次数 int m = 0; cout<<"请输入n(红、蓝、黄色各n个):"<<endl; cin>>n; for (int i=0;i<n;++i) { for (int j=0;j<3;++j) { cin>>tmp; v_tmp[j] = tmp; } v.push_back(v_tmp); } //下面来处理两两直接交换的情况,这种情况需要交换3次 for (int i=0;i<n;++i) { if (2 == v[i][0])//该放红花的地方放了黄花 { for (int j=0;j<n;++j) { if (1 == v[j][1])//该放黄花的地方放了红花 { tmp = v[i][0]; v[i][0] = v[j][1]; v[j][1] = tmp; m += 3; break; } } } if (3 == v[i][0])//该放红花的地方放了蓝花 { for (int j=0;j<n;++j) { if (1 == v[j][2])//该放蓝花的地方放了红花 { tmp = v[i][0]; v[i][0] = v[j][2]; v[j][2] = tmp; m += 3; break; } } } if (3 == v[i][1])//该放黄花的地方放了蓝花 { for (int j=0;j<n;++j) { if (2 == v[j][2])//该放蓝花的地方放了黄花 { tmp = v[i][1]; v[i][1] = v[j][2]; v[j][2] = tmp; m += 3; break; } } } } //下面来处理3换盆循环相互放错的情况,这种情况需要交换4次 for (int i=0;i<n;++i) { //该放红的地方放了黄,该放黄的地方放了蓝,该放蓝的地方放了红 if (2 == v[i][0]) { for (int j=0;j<n;++j) { if (3 == v[j][1]) { for (int k=0;k<n;++k) { if (1 == v[k][2]) { tmp = v[i][0]; v[i][0] = v[k][2]; v[k][2] = v[j][1]; v[j][1] = tmp; m += 4; break; } } } } } //该放红的地方放了蓝,该放黄的地方放了红,该放蓝的地方放了黄 if (3 == v[i][0]) { for (int j=0;j<n;++j) { if (1 == v[j][1]) { for (int k=0;k<n;++k) { if (2 == v[k][2]) { tmp = v[i][0]; v[i][0] = v[j][1]; v[j][1] = v[k][2]; v[k][0] = tmp; m += 4; break; } } } } } } cout<<"交换后:"<<endl; for(int i=0;i<n;++i) { for (int j=0;j<3;++j) { cout<<v[i][j]<<'\t'; } cout<<endl; } cout<<"最少交换次数:"<<m<<endl; return 0;}//2 1 3 2 2 3 2 1 1 2 3 1 2 1 2 3 3 1 1 1 2 3 3 2 2 1 1 3 3 3
运行结果:
1 0
- 有3n个花盆,红色、蓝色和黄色的各n个。开始时排列的顺序是混乱的,如黄、红、蓝、黄、黄、蓝、黄、红、红……
- 编写程序,包含3个标签,其背景分别为红、黄、蓝3色
- 红黄蓝绿说人生
- 三色球问题。有红、黄、绿三种颜色的球,其中红球3个,黄球3个,绿球6个。现将这12个球混放在一个盒子里,从中任意摸出8个球,编程计算摸出球的各种颜色搭配。
- 黄灿的黄玫瑰
- xcode 蓝黄文件夹
- Eclipse中web项目中的红叉和黄叹号
- 黄
- 颜色以红色、品红、蓝紫色、绿/黄、蓝、桔红和青色排序
- 最黄的黄色笑话
- 黄好的评论!
- 黄岛的日子
- “黄丝带”的祝福
- 红蓝3D的原理
- 主图指标,原创极强黄点,将军柱和黄金柱都是3日的
- 用verilog设计一个交通信号灯,要求有红,黄,绿,左转四盏灯
- 彩球分配问题:共有12个彩球,4个红的,4个白的,4个黄的,从中挑出8个球放入3个不同的口袋(口袋编号分别为a、b、c)编写程序打印输出所有可能的放法。
- xcode 工程中 拖的类不能使用(黄蓝文件夹问题)
- 二叉树的镜像
- OpenCV读取和显示图片
- 青春如此短暂,不要叹老
- ReactiveCocoa入门教程——第一部分
- JavaSe基础(25)-- 泛型
- 有3n个花盆,红色、蓝色和黄色的各n个。开始时排列的顺序是混乱的,如黄、红、蓝、黄、黄、蓝、黄、红、红……
- MapReduce程序运行流程
- Android Studio关于USB device not found的解决办法
- Android 设计模式之四:Java 23种设计模式全解析
- 单点登录的三种实现方式
- weblogic10.3.6部署项目的过程描述
- abbcad 找第一个不重复(重复)的字符
- TransForm的用法
- codeforces628D. Magic Numbers (数位dp)