目錄
構造
構造的基礎概念:
模擬
練習1:掃雷?
練習2:灌溉?
?練習3:回文日期
構造
構造的基礎概念:
構造算法是一種用于解決特定問題的算法設計方法。在C++語言中,構造算法通常涉及到創建一個函數或類來實現特定的功能。以下是一個用C++語言詳細介紹構造算法的示例:
#include <iostream> #include <vector>// 定義一個函數來實現構造算法 void constructAlgorithm(std::vector<int>& nums) {int n = nums.size();// 在這里實現構造算法的具體邏輯for (int i = 0; i < n; i++) {nums[i] = i * i;} }int main() {// 創建一個包含一定數量元素的向量std::vector<int> nums = {1, 2, 3, 4, 5};// 調用構造算法函數來處理向量中的元素constructAlgorithm(nums);// 輸出處理后的向量元素for (int i = 0; i < nums.size(); i++) {std::cout << nums[i] << " ";}return 0; }
在上面的示例中,我們定義了一個名為
constructAlgorithm
的函數來實現構造算法的邏輯。在main
函數中,我們創建了一個包含一定數量元素的向量,并調用constructAlgorithm
函數來處理向量中的元素。最后,我們輸出處理后的向量元素。通過這種方式,我們可以使用C++語言來實現構造算法,解決特定問題并實現所需的功能。
模擬
模擬算法是一種通過模擬真實世界情況來解決問題的方法。在C++中,可以通過編寫代碼來模擬算法的思路。
以下是一個簡單的示例,介紹如何用C++代碼實現一個簡單的模擬算法:
#include <iostream>int main() {// 模擬一個簡單的情況,假設有5個人排隊等待進入電影院int queue[5] = {1, 2, 3, 4, 5};// 模擬每個人進入電影院的過程for (int i = 0; i < 5; i++) {std::cout << "Person " << queue[i] << " enters the cinema." << std::endl;}// 模擬電影播放結束,人們陸續離開電影院for (int i = 0; i < 5; i++) {std::cout << "Person " << queue[i] << " leaves the cinema." << std::endl;}return 0; }
在這個示例中,我們模擬了一個簡單的場景:5個人排隊等待進入電影院,然后陸續進入電影院觀影,最后陸續離開電影院。通過這個簡單的例子,展示了如何用C++代碼實現模擬算法的思路。在實際應用中,可以根據具體問題的情況,編寫相應的模擬算法代碼。
練習1:掃雷?
1.掃雷 - 藍橋云課 (lanqiao.cn)
答案和思路:?
#include<bits/stdc++.h> using namespace std; int n,m; int arr[105][105],ans[105][105]; int main() {// 輸入n和m的值cin>>n>>m;// 輸入矩陣arr的值for(int i=0;i<n;i++){for(int j=0;j<m;j++){cin>>arr[i][j];}}// 計算每個位置周圍的1的個數for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(arr[i][j]==1){ans[i][j]=9; // 如果當前位置為1,則置為9continue;}for(int _i=max(0,i-1);_i<=min(n,i+1);_i++){for(int _j=max(0,j-1);_j<=min(m,j+1);_j++){if(arr[_i][_j]==1) ans[i][j]++; // 統計周圍1的個數}}}}// 輸出ans矩陣for(int i=0;i<n;i++){for(int j=0;j<m;j++){cout<<ans[i][j]<<" ";}cout<<endl;}return 0; }
練習2:灌溉?
1.灌溉 - 藍橋云課 (lanqiao.cn)
思路和代碼:
思路:定義兩個數組,用1記錄初始水方塊a,根據題意跟新對應水方塊,用更新完的水方塊b覆蓋a,再次迭代,直到次數結束,在規定范圍內統計水方塊個數。 #include<bits/stdc++.h> using namespace std; int main() {int n, m; // 定義矩陣的行數和列數cin >> n >> m; // 輸入矩陣的行數和列數int t; // 定義初始時有多少個位置為1cin >> t; // 輸入初始時有多少個位置為1int a[105][105], b[105][105]; // 定義兩個矩陣a和b// 輸入初始位置為1的坐標for (int i = 1; i <= t; i++){int x, y;cin >> x >> y;a[x][y] = 1; // 將指定位置置為1}int k; // 定義迭代次數cin >> k; // 輸入迭代次數while (k--){// 更新矩陣bfor (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){if (a[i][j]){b[i][j] = b[i - 1][j] = b[i][j - 1] = b[i][j + 1] = b[i + 1][j] = 1;}}}// 更新矩陣afor (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){a[i][j] = b[i][j];}}}// 統計最終有多少個位置為1int ans = 0;for (int i = 1; i <= n; i++){for (int j = 1; j <= m; j++){if (a[i][j] == 1) ans++;}}// 輸出最終結果cout << ans << endl;return 0; }
?特別注意:數組從a[1][1]開始傳入,i=0和j=0的位置空出,即使更新的時候溢出規定范圍也沒關系,注意統計時的邊界就行。
?練習3:回文日期
3.回文日期 - 藍橋云課 (lanqiao.cn)
思路和代碼:
#include<bits/stdc++.h> using namespace std;// 判斷是否為閏年 bool isleap(int y) {return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0); }// 檢查日期是否合法 bool check(int year, int month, int day) {if (month > 12 || month == 0) return false;if (month == 2){if (isleap(year) && day > 29) return false;if (!isleap(year) && day > 28) return false;}if (day > 31) return false;if (month == 4 || month == 6 || month == 9 || month == 11){if (day > 30) return false;}return true; }int main() {int n;cin >> n;int a, b, c, d, e, f, g, h;int year, month, day;bool flag = false;for (int i = n + 1; i <= 99999999; i++){year = i / 10000;month = (i % 10000) / 100;day = i % 100;a = i % 10;b = (i / 10) % 10;c = (i / 100) % 10;d = (i / 1000) % 10;e = (i / 10000) % 10;f = (i / 100000) % 10;g = (i / 1000000) % 10;h = (i / 10000000) % 10;if (a == h && b == g && c == f && d == e && flag == false){if (check(year, month, day)){cout << i << endl;flag = true;}}if (a == h && b == g && c == f && d == e && a == c && b == d){if (check(year, month, day)){cout << i << endl;break;}}}return 0; }