问题描述:有一行彩色的棋子,每个棋子的颜色是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;
}