2014亚马逊在线笔试题目及解决方案(MMChess问题)
2024-08-31 23:09:57
整体思路:关键是需要知道当前Steps数组中的全排列即可,而且需要不重复的全排列。即关键在于非递归的全排列实现即可~ 其实直接利用STL中的next_permutation算法的,这里我又自己实现了一遍该算法,当练练手了~
#include <iostream>
#include <fstream>
#include <string>
#include <istream>
#include <algorithm> using namespace std; void Swap(int& a, int&b)
{
int tmp = a;
a = b;
b = tmp;
} void ReverseArr(int *arr, int nBegin, int nEnd)
{
while (nBegin < nEnd)
{
Swap(arr[nBegin],arr[nEnd]);
nBegin++;
nEnd--;
}
} int printArr(int *nCard, int nCountOfCard, int *nStep, int nCountOfStep)
{
// 将当前结果输出,返回最大值
int nValue = nCard[];
cout<<"Card["<<<<"]"<<"("<<nCard[]<<")+";
int nIndexOfCards = ;
for (int i = ; i!=nCountOfStep; i++)
{
// 取出等式中的结果
int nIndex = nStep[i];
nIndexOfCards += nIndex;
nValue += nCard[nIndexOfCards];
cout<<"Card["<<nIndexOfCards<<"]"<<"("<<nCard[nIndexOfCards]<<")"; if (i == nCountOfStep - )
{
cout<<" = "<<nValue;
}
} cout<<endl; cout<<"步骤为:";
for (int i=; i!= nCountOfStep; i++)
{
cout<<nStep[i]<<" ";
} cout<<endl;
return nValue;
} // nCard 记录每一张卡片代表的值
int GetTheMostValue(int *nCard, int nCountOfCard, int *nStep, int nCountOfSteps)
{
// 获取步骤数的全排列 然后根据每个步骤则可以得到最终的value 然后选其中最大的即可
sort(nStep,nStep+nCountOfSteps);
//
int nResult = ;
while()
{
int nValue = printArr(nCard,nCountOfCard,nStep,nCountOfSteps); if (nValue > nResult)
{
nResult = nValue;
} for (int i = nCountOfSteps - ; i >= ; i--)
{
bool bFlag = false;
int ii = i+;
if (nStep[i] < nStep[ii])
{
// 找到相邻的 升序了
for (int j = nCountOfSteps-; j >= ; j--)
{
if (nStep[j] > nStep[i])
{
Swap(nStep[j],nStep[i]);
// 然后从ii开始到尾部 进行逆序]
ReverseArr(nStep,ii,nCountOfSteps-);
// 设置标志位 跳出两层循环
bFlag = true;
break;
}
}
// 跳出外层循环
if (bFlag)
{
break;
}
}
else if (i == )
{
// 已经结束
return nResult;
}
}
}
} int main()
{
fstream file;
file.open("E:\\2.txt");
if (file.is_open(),ios::in)
{
int nCountOfCard;
int nCountOfStep;
string str;
// 读取卡片数量和步数的个数
file>>nCountOfCard>>nCountOfStep; int *cards = new int[nCountOfCard];
int *steps = new int[nCountOfStep]; for (int i = ; i!= nCountOfCard; i++)
{
file>>cards[i];
} for (int j = ; j!= nCountOfStep; j++)
{
file>>steps[j];
} //计算各个组合~
// 其实就是将步骤数进行全排列 然后将每种组合结果输出即可~~ 在此过程中进行比较
// 使用非递归的方法吧
int nMaxValue = GetTheMostValue(cards,nCountOfCard,steps,nCountOfStep);
cout<<"最大的结果为:"<<nMaxValue<<endl; delete[] steps;
delete[] cards;
}
file.close();
return ;
}
最新文章
- javascript学习笔记全记录
- Java成员初始化顺序
- css3学习总结9--CSS3过渡
- 查找练习 hash——出现过的数字 分类: 查找 2015-06-18 17:30 7人阅读 评论(0) 收藏
- MySQL 5.7.9 免安装配置
- java多线程编程(2)交替输出数字和字母
- IOS网络开发实战(一)
- 建造者(Builder)模式
- JDK环境安装步骤
- Kubernetes helm配置国内镜像源
- 用stringstream可以用来分割空格、tab、回车换行隔开的字符串:
- Artifact project04:war :Error during artifact deployment. See server log for details
- 怎么让 Android 程序一直后台运行,像 QQ 一样不被杀死
- Dockerfile的 RUN和CMD
- Quartz在Spring中动态设置cronExpression
- 打开Word时出现“The setup controller has encountered a problem during install. Please ...”
- 简短而有效的python queue队列解释
- css未知宽高的盒子div居中的多种方法
- 09、win32 转换为 store app
- 什么是Apache ZooKeeper?
热门文章
- 探索 OpenStack 之(8):Neutron 深入探索之 OVS + GRE 之 完整网络流程 篇
- Burpsuite 重要插件
- 【译文】 GC 安全点 和安全区域
- 【URLDecoder】java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in es
- 原生JavaScript技巧
- 微信";流量红包";的玩法攻略 广东移动用户有福啦
- php项目整理之no1
- Eclipse 设置SVN忽略文件
- tornado 重定向404(方法不对)
- POI导出excel日期格式