UVA 167 蘇丹的繼承者

2021-06-09 13:55:37 字數 2851 閱讀 5906

是時候對於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 ...