資源簡介
有一座金字塔,金字塔的每塊石頭上都鑲有對應的鉆石,,不同的鉆石有著不同的價值。現在從金字塔的頂端向金字塔的底端收集鉆石,并且盡可能收集價值高的鉆石,但是只能從一塊磚斜向左下或斜向右下走到另一塊磚上找到一個收集最高價值鉆石的路線,并且告知可能收集的最大價值。
壓縮包中含有代碼.cpp,文檔,可執行文件exe

代碼片段和文件信息
#include
#include
#include???
#include
using?namespace?std;
typedef?struct?brick?{
int?key; //該位置磚石的價值
int?seleted; //是否被更上一級選擇
int?sum; //從該點向下的最大價值
}brick;
void?Output_ini(int?N?brick**a) //輸出最初的金字塔
{
for?(int?i?=0;?i?<=?N-1;?i++)?{
for?(int?j?=?0;?j?<=?i;?j++)?{
if?(j?==?0)?{
for?(int?k?=?0;?k? cout?< }
cout?< cout?< }
cout?< }
cout?<}
void?clear(int?N?brick**a) //將無用的selected置為零
{
for?(int?i?=?1;?i?<=?N?-?1;?i++)?{
for?(int?j?=?0;?j?<=?i;?j++)?{
if?(j?==?0?&&?a[i?-?1][j].seleted?==?0)
a[i][j].seleted?=?0;
else?if?(j?==?i?&&?a[i?-?1][j?-?1].seleted?==?0)
a[i][j].seleted?=?0;
else?if?(j?!=?0?&&?j?!=?i?&&?a[i?-?1][j].seleted?==?0?&&?a[i?-?1][j?-?1].seleted?==?0)
a[i][j].seleted?=?0;
else?if?(j?!=?0?&&?j?!=?i?&&?a[i?-?1][j].seleted?==?0?&&?a[i?-?1][j?-?1].seleted?!=?0?&&
a[i][j].sum?!=?a[i?-?1][j?-?1].sum?-?a[i?-?1][j?-?1].key)
a[i][j].seleted?=?0;
else?if?(j?!=?0?&&?j?!=?i?&&?a[i?-?1][j?-?1].seleted?==?0?&&?a[i?-?1][j].seleted?!=?0?&&
a[i][j].sum?!=?a[i?-?1][j].sum?-?a[i?-?1][j].key)
a[i][j].seleted?=?0;
}
}
}
void?Output_selected(int?N?brick**a) //輸出selected金字塔以便檢查
{
for?(int?i?=?0;?i?<=?N?-?1;?i++)?{
for?(int?j?=?0;?j?<=?i;?j++)?{
if?(j?==?0)?{
for?(int?k?=?0;?k? cout?< }
cout?< cout?< }
cout?< }
cout?<}
void?Max(int?N?brick**a) //得到最優路徑,標記selected
{
for?(int?i?=?N-1;?i?>=?0;?i--)?{ //自下而上?
for?(int?j?=?0;?j?<=?i;?j++)?{
if?(i?==?N-1)?{
a[i][j].sum?=?a[i][j].key;
}
else?if?(a[i?+?1][j].key?>?a[i?+?1][j?+?1].key)?{ //?左下大于右下?
a[i][j].sum?=?a[i][j].key?+?a[i?+?1][j].sum;
a[i?+?1][j].seleted?=?1;
}
else?if?(a[i?+?1][j].key? a[i][j].sum?=?a[i][j].key?+?a[i?+?1][j?+?1].sum;
a[i?+?1][j?+?1].seleted?=?1;
}
else?if(a[i?+?1][j].key?=?a[i?+?1][j?+?1].key){ //相等?
a[i][j].sum?=?a[i][j].key?+?a[i?+?1][j].sum;
a[i?+?1][j].seleted?=?1;
a[i?+?1][j?+?1].seleted?=?1;
}
}
}
a[0][0].seleted?=?1;
}
void?Output_result(int?N?brick**a) //將最優路徑輸出,可以得到多條路徑
{
for?(int?i?=?0;?i? for?(int?j?=?0;?j?<=?i;?j++)?{
if?(j?==?0)?{
for?(int?k?=?0;?k? cout?< }
if?(i?==?0?&&?j?==?0)?
cout?< else?if?(a[i][j].seleted?==?1)?{
cout?< cout?< }
else?if?(a[i][j].seleted?!=?1)?{
cout?< cout?< }
}
cout?< }
}
int?main()
{
cout?<“請輸入金字塔的層數:“?< int?n?choice=0;
cin?>>?n;
brick**?a;
a?=?new?brick*[n];
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????1859460??2018-06-08?17:30??鉆石金字塔.exe
?????文件???????4151??2018-06-06?00:52??鉆石金字塔.cpp
?????文件?????217088??2019-04-06?12:45??鉆石金字塔.docx
-----------?---------??----------?-----??----
??????????????2080699????????????????????3
評論
共有 條評論