有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
原创粉丝点击