问题描述
有36匹马,要在有6个道的跑道上跑,每次最多只能跑6匹,不用计时器,问最少需要跑多少次可以求得最快的三匹马?
C++实现
#include <ctime> #include <cstdlib> #include <iostream> #include <map> using namespace std; typedef map<int,int *> IntpIntMap; //冒泡排序 void bubbleSort(int arr[], int len) { int i , j; for (i = 0 ; i < len - 1; i++) { for (j = 0; j < len - i - 1; j++) { if (arr[j]>arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } void fun(int arr[]) { int i; int temp[6]; IntpIntMap coll; IntpIntMap::iterator pos; //6*6先分别比赛一次 for(i=0;i<6;++i) bubbleSort(arr+i*6,6); /* 把上面6次比赛的第一名的比赛一遍(map会自动排序), 并且将其相应的地址放到map中 */ for(i=0;i<6;++i) coll.insert(make_pair(arr[i*6],arr+i*6)); /* 将本次第一的,开始前三的放到temp数组中 将本次第二的,开始前二的放到temp数组中中 将本次第三的,开始前一的放到temp数组中中 */ for(pos=coll.begin(),i=0;pos!=coll.end();++pos,++i) { if(0==i) { temp[0]=pos->second[0]; temp[1]=pos->second[1]; temp[2]=pos->second[2]; } if(1==i) { temp[3]=pos->second[0]; temp[4]=pos->second[1]; } if(2==i) temp[5]=pos->second[0]; } //将temp数组排序,打印出前三的 bubbleSort(temp,6); printf("%d %d %d\n",temp[0],temp[1],temp[2]); } int main() { int arr[36]; int i; for(i=0;i<36;++i) { arr[i]=rand()%1000; printf("%d\t",arr[i]); } printf("\n\n"); fun(arr); }
时间: 2024-10-21 02:35:52