第一部分 基礎演算法(第四章 深度優先搜尋)例題

2021-10-14 05:48:58 字數 3040 閱讀 2556

思路:

考慮條件(1),顯然只用構造乙個大小為n/2的組

考慮條件(2),顯然兩個組的體重之和是固定的,

記所有人的體重和為s,

則我們只用考慮構造出來的每乙個的體重和盡可能接近s/2即可。

通過dfs函式來完成以上操作,

有乙個三元組(x,y,z)描述當前狀態(第x位成員,已選y個人,體重和為z)

判斷重複

數獨要求每一行、每一列、每乙個3×3方陣內的數字,不重複。

行和列重複判斷是相當簡單的。我們可以定義兩個bool型二維陣列,當此行(或列)填充數字時,我們可以直接把這行的這個數字打上true表示有數字了。

//譬如第一行第三列填入數字2

bool p[

],l[

];//p:行,l:列;p[1

][2]

=l[3][

2]=true

;

如果後面再填充數字,就判斷此行(或列)是否填過這個數字即可。

重點:判斷方陣中數字重複

如果判斷方陣中數字重複?怎樣用行列來表示是幾方陣成了個問題。但是不用怕,我們有van能的數學。

觀察下面這個數獨:

可以看到,每過3列,方陣的序號+1,每過3行,方陣的序號+3。

於是我們有了這樣的表示式:

方陣序號=(行數-

1)/3*3

+(列數-

1)/3+1

//注意!行數列數要-1,因為3的整數倍數/3會比原方陣大1,不能滿足上述需求。

有了上述方法,就可以寫個深搜函式來解決問題了!

思路:

這道題我們顯然是不能去列舉n個字母所代表的數,

不然時間複雜度就會昇華到o(n!)。

依次列舉每乙個字母代表哪個數

手動做豎式加法是從右往左,這樣方便下面的剪枝:

從右往左列舉每一列,記當前加數,被加數,

和分別為a, b, c,如果右邊的數已經全部賦值,

則當前的進製我們也是知道的,記為t

如果a +b

+t≠c

a+b+t\neq c

a+b+t

​=c,那麼方案不合法

如果右邊存在某乙個未知數尚未確定,則進製t可能去0或1,

那麼如果a+b

+0≠c

a+b+0\neq c

a+b+0

​=c && a+b

+1≠c

a+b+1\neq c

a+b+1

​=c,那麼方案不合法

另外對於最高位,由題意得是不可能進製的,

即當i==1時,判斷是有進製,有進製則方案不合法

#include

#include

#include

using

namespace std;

const

int n =27;

int n, cnt[n]

, tot, a, b, c, num[n]

;bool vis[n]

, used[n]

;char s[n]

[n];

bool

check()

else

}else x =-1

;}return1;

}bool

dfs(

int x)

return0;

}int

main()

作業系統原理之記憶體管理 第四章第一部分

記憶體管理的 標 實現記憶體分配和 提高記憶體空間的利用率和記憶體的訪問速度 暫存器 在cpu內部有一組cpu暫存器,暫存器是cpu直接訪問和處理的資料,是乙個臨時放資料的空間。高速緩衝區 一般cpu都會從內訪問資料到暫存器,然後進行處理,但由於記憶體的處理速度遠遠低於cpu,導致cpu在處理指令時...

演算法第一部分(1)

1.學習演算法,最好先了解陣列,鍊錶,堆,棧等線性結構 2.對遞迴,遍歷,演算法複雜度有著常識性理解 3.主要包括三方面的知識 線性 主要是排序 樹形結構 圖形結構 定義 選擇排序每次都從剩下的n i 個元素找到最小的數,並與i位置的數交換位置。public void selectionsort t...

Axure RP 第一部分

axure rp是乙個專業的快速原型設計工具。axure 發音 ack sure 代表美國axure公司 rp則是rapid prototyping 快速原型 的縮寫。axure rp是美國axure software solution公司旗艦產品,是乙個專業的快速原型設計工具,讓負責定義需求和規格...