请编写意程序:将各花盆按红、黄、蓝、红、黄、蓝……的顺序排列,而且要求花盆之间的交换次数最少。
分析:交换两个变量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
运行结果: