第四章例題整理
阿新 • • 發佈:2020-12-12
//30個學生的平均成績及其標準差
#include
#include
using namespace std;
int main()
{
srand(0);
constexpr int sz = 30;
int score[sz];
int mean = 0; //
for (auto& i : score) //
{
i = 50 + rand() % 51; //
mean += i; //
} mean /= sz; double dev = 0; for (int i = 0; i < sz; ++i) { dev += pow(score[i] - mean, 2); // pow(x, y)是求x的y次方 } dev = sqrt(dev / sz); cout << mean << endl << dev; return 0;
}
//八皇后問題 涉及回溯法的應用
#include
using namespace std;
int main()
{
constexpr int sz = 8;
int que[sz] = { 0 }; //每行皇后從第0列開始擺放
int i = 0;
while (i >= 0)
{
int k = 0; /// 即第k行皇后
while (k < i)
{
if (que[k] != que[i] && abs(que[k] - que[i]) != abs(k - i)) // 判斷第k行與第i行皇后有無衝突
++k;
else /// 不成立, 所以需要跳出語句進行回溯
break;
if (k < i) //因上一語句的break成立,即發現衝突,則開始回溯
{
++que[i]; // 第i行皇后往後移一列
while (que[i] ==sz)//因只有八列,若此時超出第八列,則需要第i行皇后回到第0列,第i-1行皇后開始回溯
{
que[i] = 0;
–i;
if (i < 0)
break;//此時為回溯到第0行之前,則需要跳出運算,重新運算
++que[i];//若未跳出o0行之前,則因此時的i為i-1行,讓第i-1行往後移一列
}
continue;//此時為重複最前面的while語句,從而再次檢測是否有發生衝突,返回到第9行
}
else //因k》=i 則跳轉到else語句來給行數新增1
++i;
if (i <sz)//如果i還沒有超出第八行
continue;//則再次進行最大的while語且因此時的i值的改變
cout << “找到一個方案” << endl;
for (k = 0; k < sz; ++k)/此時找到一個方案來輸出,且所有的皇后的列位置在前面語句中已經全部設計好
cout << que[k];
cout << endl;
break;
}
}
return 0;
}
//做一個地雷方陣
#include
#include
#include
using namespace std;
int main()
{
constexpr int sz = 8;
srand(time(0));
char map[sz][sz]; //
for (auto& row : map)
{
for (auto &col : row)
{
int num = rand() % 100;
if (num <= 40)
col = '*';
else
col = '0';
}
}
for (int i = 0; i < sz; ++i)
{
for (int j = 0; j < sz; ++j)
{
if (map[i][j] !='*')//為了找出每個地雷
continue;
if (i + 1 < sz && map[i + 1][j] != '*')給地雷旁邊的0加1
map[i + 1][j] += 1;
if (i - 1 >= 0 && map[i - 1][j] != '*')
map[i -1][j] += 1;
if (j + 1 < sz && map[i][j+1] != '*')
map[i][j+1] += 1;
if (j-1 >= 0 && map[i][j-1] != '*')
map[i][j-1] += 1;
}
}
for (int i = 0; i < sz; ++i)
{
for (int j = 0; j < sz; ++j)
{
cout << map[i][j] << " ";
}
cout << endl; ///輸出完一個一維矩陣後換行輸出另一個一維矩陣
}
return 0;
}