訓練一 簡搜

2021-09-29 21:29:48 字數 3799 閱讀 4813

題意:多組輸入,輸入兩個整數n,k

在乙個n*n的矩陣中擺放棋子。

其中』.『為空白區域,』#'為棋子區域;q

在棋子區域擺放k個棋子,並且要求乙個棋子的所在的行和列不能再擺放棋子。

思路:深搜的板子題,拜訪的棋子數初始化為0;

(1)從矩陣的第一行開始,

(2)遍歷每一行每乙個元素尋找』#』;

(3)如果其沒有被訪問過,那麼標記這個位置,擺放棋子數加1;

(4)然後遍歷下一行,重複(2)(3)過程;

(5)如果在此過程中棋子數等於k,那麼方案數加1,返回;如果遍歷至最後一行也返回。

#include

#include

int visited[10]

;int n,k,count;

char mark[10]

[10];

void

dfs(

int x,

int y)

if(x>=n)

return

;for

(j =

0;j dfs(x +

1, y);}

intmain()

return0;

}

#include

#include

#include

#include

using

namespace std;

struct node

;int vis[40]

[40][

40];char map[40]

[40][

40];int move[6]

[3]=

,,,,

,};int l,r,c;

int x1,y1,z1;

void

bfs(

)for

(int i =

0;i <

6;i++)}

} cout<<

<}int

main()

}}memset

(vis,0,

sizeof

(vis));

bfs();

}return0;

}

題意:假設農夫與牛在乙個數軸的兩個不同的位置,農夫每步可以前進或後退一格,也可以跳躍到當前座標兩倍的位置。

算出農夫要多少步才能抓住牛。

思路:已經去過的位置不能再去;

每一步選擇三種方式中的一種,直到抓住牛。

#include

#include

#include

using

namespace std;

const

int maxn=

1e6;

int n,k;

int vis[maxn+10]

;struct step};

queueq;

intmain()

else

if(s.x +

1<=maxn&&

!vis[s.x+1]

)if(s.x *

2<=maxn&&

!vis[s.x*2]

) q.

pop();

}}}return0;

}

題意:多組輸入,當輸入0時,輸入結束。

計算輸入資料的倍數(用十進位制表示),但是倍數的每一位只能是0或1,

評測實施特判,即只輸出乙個滿足條件的輸入資料的倍數即可

思路:水題,直接上**。

#include

int vis,n;

void

dfs(

unsigned

long

long x,

int y)

;int

main()

return0;

}void

dfs(

unsigned

long

long x,

int y)

dfs(x*

10,y+1)

;dfs

(x*10+1

,y+1);

}

題意:多組輸入。

每次輸入兩個質數 ,計算將前乙個質數標為後乙個質數所需要的最小步數,每一步只能改變一位數字,且改變後仍然是質數。不能變為後乙個質數的則輸出「impossible」。

思路:改變一次判斷一次是否為質數,且每個數至多只能出現一次。

#include

#include

#include

#include

using

namespace std;

int m,n;

int data[

10000];

struct node

;int

isprime

(int x)

void

bfs(

)for

(int i =

1; i <=

9;i +=2

)}for(

int i =

0;i <=

9;i++)}

for(

int i =

0;i <=

9;i++)}

for(

int i =

1;i <=

9;i++)}

}printf

("impossible\n");

return;}

intmain()

return0;

}

題意:在5*5的矩陣1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。

思路:這道題評測姬的資料有缺陷,導致我僥倖ac,貼上**。

#include

int maze[5]

[5];

int move[4]

[2]=

,,,}

;void

bfs(

int x,

int y)

return;}

intmain()

題意:多組輸入,輸入 0 0結束。

『 * 』橫豎斜有『*'算一塊,計算矩陣中有幾塊油田。

思路:與地牢類似,但有細微不同。

#include

int m,n;

char map[

110]

[110];

int move[8]

[2]=

,,,,

,,,}

;void

dfs(

int x,

int y)

return;}

intmain()

}}printf

("%d\n"

,total);}

return0;

}

省賽訓練F 廣搜

問題的模型是 在允許消耗一定量生命換取時間的前提下,從起始點到終點所需的最短時間。利用廣度優先搜尋,陣列ti i j k 表示失去k點血量時,到達 i,j 的最快時間。由於開始有100點血,血量小於等於0時死亡,實際可用血量是99。使用優先佇列,佇列節點有三個屬性 x,y,k,x,y 為該節點表示的...

藍橋杯訓練 爆搜 猜年齡

問題描述 猜年齡美國數學家維納 n.wiener 智力早熟,11歲就上了大學。他曾在1935 1936年應邀來中國清華大學講學。一次,他參加某個重要會議,年輕的臉孔引人注目。於是有人詢問他的年齡,他回答說 我年齡的立方是個4位數。我年齡的4次方是個6位數。這10個數字正好包含了從0到9這10個數字,...

HDOJ 2019寒假訓練 BFS(寬搜)總結篇

bfs演算法工作機制 由一點引起的 對周圍的資料進行盲目搜尋 即無權值路徑 根據這一點bfs更多用於座標化的迷宮,或者不需要考慮有關路徑權值大小的圖形等的抽象搜尋問題。可以將bfs的過程想象成水波的漣漪 即若每乙個搜尋中心即水波的中心,則從該搜尋中心出發經由的搜尋點則是同一漣漪環上的點。然後漣漪上的...