是時候對於dfs搜尋做乙個簡單的小結了
八皇后問題
解法一:
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
///#define inf 0xffffff7
#define maxn 1010
///int weight;
int k;
int score[10][10];
int placement[8];
void dfs(int cur, int w)
for (i = 0; i < 8; i++)
}if (ok)
}}int main()
} dfs(0, 0);
cout << setw(5) << weight << endl; }
///return 0;
}
方法二:採用
深度優先回溯的另外一種形式
採用stack儲存狀態,採用set儲存狀態是否曾經訪問過
關鍵問題在於找到一種唯一表徵某一種狀態的方式,如果能轉化為類似int這種簡單形式是最好的
跑了一下,發現比方法一速度慢,原因可能在於狀態比較函式比較複雜,如果能簡化速度應該能更快
偽**如下所示
// 深度優先搜尋不斷的向前尋找可行狀態,試圖一次找到通向目標狀態的道路,它並不會兩次訪問乙個狀態,
// 由於某些搜尋樹包含大量的棋面狀態,因此深度優先搜尋只是在最大搜尋深度固定的情況下才具有可行性,
// 深度優先搜尋維護乙個棧,儲存未訪問過的棋面狀態。在每次迭代時,深度優先搜尋從棧中彈出乙個未訪問
// 的棋面狀態,然後從這個棋面狀態開始擴充套件,根據走法計算其後繼棋面狀態。如果達到了目標棋面狀態,搜
// 索終止。如果沒有達到的話,任何在閉合集中後繼棋面狀態都會被拋棄。剩餘的未訪問棋面狀態被壓入棧中,
//// search (initial, goal)
// if (initial = goal) then return "solution"
// initial.depth = 0
// open = new stack
// closed = new set
// insert(open, copy(initial))
// while (open is not empty) do
// n = pop(open)
// insert(closed, n)
// foreach valid move m at n do
// next = state when playing m at n
// if (closed doesn't contain next) then
// next.depth = n.depth + 1
// if (next = goal) then return "solution"
// if (next.depth < maxdepth) then
// insert(open, next)
// return "no solution"
// end
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
///#define inf 0xffffff7
#define maxn 1010
///int weight;
int k;
int score[10][10];
int placement[8];
struct state;
//用於插入set,改變預設的比較函式
struct type_order
return false;
} };
void deepth_first_search(const state &initstate)
}//如果放置成功
if (ok)
}else
open.push(next);
}} }
}int main()
} //給定初始條件
state initstate;
initstate.w = 0;
initstate.nums = 0;
memset(initstate.place, 0, sizeof(initstate.place));
deepth_first_search(initstate);
cout << setw(5) << weight << endl; }
///return 0;
}
AC之回溯演算法UVA167
經典的八皇后問題,此題要求和。用的c c,d陣列判斷對角線,a 0 判斷此列是否有皇后,只有滿足三個條件才能算找到,a 0 判斷此行皇后在哪 核心 中 分別判斷1.如果沒找到 y 9 回溯 2.在最後一行找到了,儲存記錄資料,回溯 3.普通找到,繼續執行 缺點就是作為萌新 冗雜。include in...
素篩優化 UVA 11752 超級冪
題目大意 超級冪 是至少兩個數的冪 輸出1 2 64 1 的所有超級冪 解題思路 首先想到肯定是用素數來篩選,但是不可能用素數來篩選可行解,比如 素數2,列舉2的冪,在進行比較,絕對超時 那我們只能將素數用於冪的選擇上也就是素數不選 但這樣仍然過不了,會越界 這裡可以使用兩種優化邊界處理方式 1 我...
UVA10892 最小公倍數素因子分解
題意 輸入正整數n,統計有多少a b滿足lcm a,b n。輸出n以及滿足條件的整數對數。思路 根據素因子分解求最小公倍數的演算法,可以的得出這樣的結論。如果對乙個數進行素因子分解,那麼思路就明顯了 1.設n lcm a,b p1 r1 p2 r2 p3 r3 pm rm 又設a p1 a1 p2 ...