排列數字
給定乙個整數n,將數字1~n排成一排,將會有很多種排列方法。
現在,請你按照字典序將所有的排列方法輸出。
輸入格式
共一行,包含乙個整數n。
輸出格式
按字典序輸出所有排列方案,每個方案佔一行。
資料範圍
1≤n≤7
輸入樣例:3
輸出樣例:1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
**樣例#include
using
namespace std;
const
int n=10;
int n;
// 儲存排列方式
int path[n]
;// 標記當前數字是否可以使用
bool st[n]
;void
dfs(
int u)
// dfs
for(
int i=
1;i<=n;i++)}
}int
main()
n 皇后問題
n-皇后問題是指將 n 個皇后放在 n∗n 的西洋棋棋盤上,使得皇后不能相互攻擊到,即任意兩個皇后都不能處於同一行、同一列或同一斜線上。
現在給定整數n,請你輸出所有的滿足條件的棋子擺法。
輸入格式
共一行,包含整數n。
輸出格式
每個解決方案佔n行,每行輸出乙個長度為n的字串,用來表示完整的棋盤狀態。
其中」.」表示某乙個位置的方格狀態為空,」q」表示某乙個位置的方格上擺著皇后。
每個方案輸出完成後,輸出乙個空行。
注意:行末不能有多餘空格。
輸出方案的順序任意,只要不重複且沒有遺漏即可。
資料範圍
1≤n≤9
輸入樣例:4
輸出樣例:.q..
...q
q...
..q.
..q.
q...
...q
.q..
**樣例
按行列舉
#include
using
namespace std;
const
int n=20;
int n;
// 儲存結果
char path[n]
[n];
// 判斷每列或對角線是否已經已經存在皇后
bool a[n]
,b[n]
,c[n]
;void
dfs(
int u)
return;}
for(
int i=
0;i}int
main()
dfs(0)
;return0;
}
對角線的位置判斷y=x+i
i=y-x 可能為負數,加乙個偏移量 n i=y-x+n
y=-x+i
i=y+x
**樣例
按元素列舉
#include
using
namespace std;
const
int n=20;
int n;
char path[n]
[n];
bool a[n]
,b[n]
,c[n]
,d[n]
;// x 代表列 y 代表行 s 代表皇后個數
void
dfs(
int x,
int y,
int s)
if(x==n)
// 說明已經列舉完 n*n 個格仔
cout<
}return;}
// 不放皇后
dfs(x,y+
1,s)
;//放皇后 if(
!a[y]
&&!b[x]
&&!c[y+x]
&&!d[x-y+n])}
intmain()
dfs(0,
0,0)
;return0;
}
廣度優先搜尋可以搜尋到最短路,第一次將全部距離為1的點搜到,二次將全部距離為2的點搜到…走迷宮給定乙個n*m的二維整數陣列,用來表示乙個迷宮,陣列中只包含0或1,其中0表示可以走的路,1表示不可通過的牆壁。
最初,有乙個人位於左上角(1, 1)處,已知該人每次可以向上、下、左、右任意乙個方向移動乙個位置。
請問,該人從左上角移動至右下角(n, m)處,至少需要移動多少次。
資料保證(1, 1)處和(n, m)處的數字為0,且一定至少存在一條通路。
輸入格式
第一行包含兩個整數n和m。
接下來n行,每行包含m個整數(0或1),表示完整的二維陣列迷宮。
輸出格式
輸出乙個整數,表示從左上角移動至右下角的最少移動次數。
資料範圍
1≤n,m≤100
輸入樣例:5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
輸出樣例:8
**樣例#include
#include
#include
using
namespace std;
const
int n=
110;
typedef pair<
int,
int> pii;
int n,m;
int g[n]
[n];
// 儲存圖
int d[n]
[n];
// 儲存每個點到起始點的距離
pii q[n*n]
,t;int
bfs();
memset
(d,-1,
sizeof d)
;// 初始化
d[0][
0]=0
;int dx=
,dy=
;// 向四個方向延伸,向量法
while
(hh<=tt)
;// 更當前新位置 }}
}return d[n-1]
[m-1];
}int
main()
cout<<
bfs(
)<
return0;
}
在乙個 3×3 的網格中,1∼8 這 8 個數字和乙個 x 恰好不重不漏地分布在這 3×3 的網格中。
例如:
1 2 3
x 4 6
7 5 8
在遊戲過程中,可以把 x 與其上、下、左、右四個方向之一的數字交換(如果存在)。
我們的目的是通過交換,使得網格變為如下排列(稱為正確排列):
1 2 3
4 5 6
7 8 x
例如,示例中圖形就可以通過讓 x 先後與右、下、右三個方向的數字交換成功得到正確排列。
交換過程如下:
1 2 3 1 2 3 1 2 3 1 2 3
x 4 6 4 x 6 4 5 6 4 5 6
7 5 8 7 5 8 7 x 8 7 8 x
現在,給你乙個初始網格,請你求出得到正確排列至少需要進行多少次交換。
輸入格式
輸入佔一行,將 3×3 的初始網格描繪出來。
例如,如果初始網格如下所示:
1 2 3
x 4 6
7 5 8
則輸入為:1 2 3 x 4 6 7 5 8
輸出格式
輸出佔一行,包含乙個整數,表示最少交換次數。
如果不存在解決方案,則輸出 −1。
輸入樣例:
2 3 4 1 5 x 7 6 8
輸出樣例19
**樣例#include
#include
#include
#include
using
namespace std;
intbfs
(string start)
,dy=
;while
(!q.
empty()
)// 佇列不為空
swap
(t[a*
3+b]
,t[l]);
// 還原狀態 }}
}return-1
;// 隊列為空還沒有找到則說明找不到
}int
main()
cout<<
bfs(start)
<
return0;
}
深度優先搜尋(DFS)和廣度優先搜尋(BFS)
先說dfs 關於dfs和bfs的搜尋題目,首先要將其轉化為樹,如迷宮,也可轉化為樹來搜尋 dfs是一條鏈一條鏈的搜尋,而bfs是逐層進行搜尋,這是他倆乙個很大的區別 給定整數a1 a2 a3 an,判斷是否可以從中選出若干個數,使得他們的和恰好為k。限制條件 樣例 4 n 1 2 4 7 a陣列 1...
深度優先搜尋(DFS)和廣度優先搜尋(BFS)
深度優先搜尋和廣度優先搜尋都是圖形搜尋演算法,1 深度優先搜尋 是針對圖和樹的遍歷演算法,利用深度優先搜尋演算法可以產生目標圖的相應的拓撲排序表,利用拓撲排序表可以方便的解決了很多相關的圖論問題,如最大路徑問題,一般用堆資料結構來輔助實現dfs 演算法,其過程要來說是對每乙個可能的分支路徑深入到不能...
深度優先搜尋DFS和廣度優先搜尋BFS
注意 用遞迴 其實就是棧 和棧實現。有n個物品,沒見物品的重量為w i 價值為c i 現在需要選出若干件物品放入乙個容器為v的 揹包中,是的在選入揹包的物品重量和不超過容量v的前提下,讓揹包中物品的價值之和最大,求最大價值。void dfs int index,int sumw,int sumc d...