問題 C 寬搜入門 8數碼難題

2021-09-19 20:49:28 字數 1784 閱讀 1284

時間限制: 20 sec  記憶體限制: 128 mb

提交: 193  解決: 69

[提交][狀態][討論版][命題人:外部匯入]

初始狀態的步數就算1,哈哈

輸入:第乙個3*3的矩陣是原始狀態,第二個3*3的矩陣是目標狀態。

輸出:移動所用最少的步數

input

2 8 3

1 6 4

7 0 5

1 2 3

8 0 4

7 6 5

output

[提交][狀態]

去除全部重複入隊結點,將入隊結點的重複率降至0。儲存入隊資訊的資料結構方案有:1. set(動態,紅黑樹)  2.陣列table(靜態)。 屬於最極端的方法是:曾入隊的結點(狀態)無需再入隊。結點之間的關係(前驅後繼關係) 不刻畫也沒關係。這種方法要求較多的記憶體 記錄每個狀態的入隊資訊。然而我們剪枝的目的就是要減少遍歷的數量,進而減少記憶體消耗。故該方法 有點矛盾。不過選擇合適的資料結構方案可減緩該矛盾。

去除部分重複入隊結點,一定程度上降低入隊結點的重複率。這需要一定的技巧,因為要確定去除哪些高頻重複結點好。由上一方法,引發思考,我們可以只記錄部分狀態的入隊資訊,進而減少記憶體消耗。本題中就只記錄上上個狀態的入隊資訊,避免消耗過多的記憶體來記錄所有狀態的入隊資訊。但會一定程度上增加 結點的重複入隊率。在本題中,採用這種剪枝方法 降低了總體的記憶體消耗。

本題**實測效能對比圖。其中方法一:去除全部重複入隊結點。方法二:去除 與上上個結點重複的入隊結點。效果對比:方法二 在記憶體消耗上 效果提公升了。因為方法一採用map 來記錄入隊資訊,耗時還增加了。

}//雜湊對映,a對映為string

string hashm(int a[maxn])

}return str;

}int findm(int a[maxn])

int equalm(int a[maxn], int b[maxn])

}return 1;

}void printm(int a[maxn])

printf("\n");

}}int bfs(node s, int b[maxn])

// printf("%d\n", hashm(next.a));

// printm(next.a);

}} while(!q.empty());

return -1;

}int main();

node s;

int x, y;

for(int i=0; i<3; i++)

}for(int i=0; i<3; i++)

}// printm(s.a);

// printm(b);

printf("%d\n", bfs(s, b));

return 0;

}

codeup 寬搜入門 8數碼難題 BFS

初始狀態的步數就算1,哈哈 輸入 第乙個3 3的矩陣是原始狀態,第二個3 3的矩陣是目標狀態。輸出 移動所用最少的步數 input 2 8 3 1 6 4 7 0 5 1 2 3 8 0 4 7 6 5 output 注意 題目中 0的位置是可以移動的空格。分析 首先題目要求求最少的步數,很容易想到...

5997 Problem C 寬搜入門 8數碼難題

時間限制 20 sec 記憶體限制 128 mb 提交 85 解決 26 提交 狀態 討論版 命題人 外部匯入 初始狀態的步數就算1,哈哈 輸入 第乙個3 3的矩陣是原始狀態,第二個3 3的矩陣是目標狀態。輸出 移動所用最少的步數 input 2 8 3 1 6 4 7 0 5 1 2 3 8 0 ...

8數碼問題 深搜 廣搜

8數碼問題的廣搜在網上可以找到 廣搜一般可以找到最優解,但是深搜不一定能找到最優解。一般的深搜多是指定最大遞迴深度的深搜,一般情況下,問題解的深度很難確定。因此深蒐會出現三種情況,一是找到最優解,二是在迭代深度內找不到解,三是找到解但不是最優解。第一種情況自然是最好的,不過較經常出現的是第三種,在指...