特斯拉第三代家庭充電樁 21.36.4 韌體更新:可識別車架號,不認識的車不能充
一、實驗目的
掌握分治法的設計思想、具體實現和時間複雜度分析。。
二、實驗要求
先用虛擬碼或流程圖描述利用分治法解決的演算法解決方案,再用程式實現,計算時間複雜度,記錄最終測試資料和測試結果,執行時間。
三、演算法虛擬碼或流程圖
(1) 數字旋轉方陣
輸入:當前層左上角要填的數字number,左上角的座標begin,方陣的階數size
輸出:數字旋轉方陣
-
如果size等於0,則演算法結束;
-
如果size等於1,則d[begin][begin] = number,演算法結束;
-
初始化行、列下標:i = j = begin;
-
重複下述操作size-1次,填寫區域A
4.1 d[i][j] = number; number++;
4.2 i++; -
重複下述操作size-1次,填寫區域B
5.1 d[i][j] = number; number++;
5.2 j++; -
重複下述操作size-1次,填寫區域C
6.1 d[i][j] = number; number++;
6.2 i--; -
重複下述操作size-1次,填寫區域D
7.1 d[i][j] = number; number++;
7.2 j--; -
呼叫函式Full在size-2階方陣中左上角begin+1處從數字number開始填數;
(2) 最大子段和問題
(3) 棋盤覆蓋問題
輸入:棋盤左上角座標(tr,tr);特殊方塊的位置(dr,dr);棋盤大小size;
輸出:使用L型骨牌覆蓋好的棋盤 -
覆蓋左上角子棋盤
-
覆蓋右上角子棋盤
(2) (2) (2) (2) (2) (2) (2)
四、程式實現
(1) 數字旋轉方陣
include
using namespace std;
define MAX 100
int d[MAX][MAX];
void Full(int number, int begin, int size);
int main() {
int n;
cout << "請輸入方陣階數n:" << endl;
cin >> n;
Full(1, 0, n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if(i<n-1)
cout << d[i][j] << " " ;
else
cout << d[i][j] << " ";
}
cout << endl;
}
}
void Full(int number, int begin, int size) {
int i, j, k;
if (size == 0)
return;
if (size == 1) {
d[begin][begin] = number;
return;
}
i = j = begin;
for (k = 0; k < size - 1; k++) {
d[i][j] = number;
number++;
i++;
}
for (k = 0; k < size - 1; k++) {
d[i][j] = number;
number++;
j++;
}
for (k = 0; k < size - 1; k++) {
d[i][j] = number;
number++;
i--;
}
for (k = 0; k < size - 1; k++) {
d[i][j] = number;
number++;
j--;
}
Full(number, begin + 1, size - 2);
}
(2) 最大子段和問題
(3) 棋盤覆蓋問題
(2) (2) (2) (2) (2) (2) (2)
五、實驗結果展示、時間複雜度分析
(1) 數字旋轉方陣
結果展示:
時間複雜度:O(n^2)
(2) 最大子段和問題
(3) 棋盤覆蓋問題
(2) (2) (2) (2) (2) (2) (2)