彩色石子 问题的C++解法

问题描述:有一行彩色的棋子,每个棋子的颜色是k种颜色之一。你不能改变棋子的顺序,但是可以移走一些棋子。问至少移走多少个石子,才能使得两个同色的石子之间没有其他颜色的棋子? 输入格式: 多组数据,每组数据两行,第一行是两个整数n和k, 1<=n<=100, 1<=k<=5 下一行是n个在[1..k]范围内的正整数,代表每个棋子的颜色。 输出格式: 每组测试数据输出一行包含一个整数,表示至少移走的石子数。 注:可以移走第2个第7个棋子。
方法很笨,希望有高手能提供更好的算法,此贴只为抛砖引玉!
#include <iostream>
#include <vector>

bool less(const int m1, const int m2){
    return (m1%10) < (m2%10);
}

std::vector<int> numMove(int pieceNum, std::vector<int> pieceSequence){
//vec 用来将颜色放在一个二位数组中,    //行数                  //列数
    std::vector<std::vector<int> > vec(5, std::vector<int>(pieceNum)) ;
    for (int i = 0; i < pieceSequence.size(); ++i){
        switch (pieceSequence[i]) {
            case 1:
                vec[0][i] = pieceSequence[i];
                break;
            case 2:
                vec[1][i] = pieceSequence[i];
                break;
            case 3:
                vec[2][i] = pieceSequence[i];
                break;
            case 4:
                vec[3][i] = pieceSequence[i];
                break;
            case 5:
                vec[4][i] = pieceSequence[i];
                break;
                
            default:
                break;
        }
    }
    
    //找出一列数 如:1001001001 距离最近的两个1
    std::vector<int> result(5);
    int j = 0;
    while (j < 5) {
        std::vector<int> color = vec[j];
        
        int subValue = 1000;
        int p = 1000;
        int tmp = -1000;
        int totalnum = 0;
        
        for (int i = 0; i < color.size(); i++) {
            
            switch (color[i]) {
                case 1:
                    
                    tmp  = p;
                    p = i;
                    if(totalnum > 0){
                        if((p - tmp) < subValue)
                            subValue = p - tmp;
                    }
                    totalnum += 1 ;
                    break;
                case 2:
                    
                    tmp  = p;
                    p = i;
                    if(totalnum > 0){
                        if((p - tmp) < subValue)
                            subValue = p - tmp;
                    }totalnum += 1 ;break;
                case 3:
                    
                    tmp  = p;
                    p = i;
                    if(totalnum > 0){
                        if((p - tmp) < subValue)
                            subValue = p - tmp;
                    }totalnum += 1 ;break;
                case 4:
                    
                    tmp  = p;
                    p = i;
                    if(totalnum > 0){
                        if((p - tmp) < subValue)
                            subValue = p - tmp;
                        
                    } totalnum += 1 ;break;
                case 5:
                    
                    tmp  = p;
                    p = i;
                    if(totalnum > 0){
                        if((p - tmp) < subValue)
                            subValue = p - tmp;
                    }totalnum += 1 ;break;
                    
                default:
                    break;
            }
        }
        result[j] = (j+1)* 10 + (subValue - 1);
        ++j;
    }
    std::sort(result.begin(),result.end(),less);
    return result;
}

int main(){
    std::cout<<"Please input two numbers,split with enter."<<std::endl;
    
    //棋子的数目
    int pieceNum;
    std::cout<<"The number of piece(1 <= pieceNum <= 100): ";
    std::cin >> pieceNum;
    while (pieceNum < 1 || pieceNum > 100) {
        std::cout<<"Wrong input ,please input again: ";
        std::cin >> pieceNum;
        
    }
    std::cout<<"The number of piece is "<<pieceNum<<"."<<std::endl;
    
    //颜色的种类
    int colorNum;
    std::cout<<"The number of color(1 <= colorNum <= 5): ";
    std::cin >> colorNum;
    while (colorNum < 1 || colorNum > 5) {
        std::cout<<"Wrong input ,please input again: ";
        std::cin >> colorNum;
        
    }
    std::cout<<"The number of color is "<<colorNum<<"."<<std::endl;
    std::vector<int> vec(pieceNum);
    //检测输入是否合格:输入的总数是不是正确,输入的每个数字是否在规定的范围内,最好是用数组。以后计算简单
    int i = 0;
    while (i < pieceNum) {
        
        int pieceSequence;
        std::cin >> pieceSequence;
        if(pieceSequence < 1 || pieceSequence > colorNum){
            std::cout<<"out of the range,please input again!"<<std::endl;
            continue;
        }
        vec[i] = pieceSequence;
        ++i;
    }
    std::vector<int> result = numMove(pieceNum,vec);
    std::cout<<"color:"<<(result[0]/10)<<" move away num:"<<(result[0]%10)<<std::endl;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值