藍橋杯模擬賽 滑動解鎖

2021-09-20 14:10:03 字數 1666 閱讀 1981

參考了這位大牛:

題目:滑動解鎖

滑動解鎖是智慧型手機一項常用的功能。你需要在3x3的點陣上,從任意乙個點開始,反覆移動到乙個尚未經過的」相鄰」的點。這些劃過的點所組成的有向折線,如果與預設的折線在圖案、方向上都一致,那麼手機將解鎖。

所謂兩個點「相鄰」:當且僅當以這兩個點為端點的線段上不存在尚未經過的點。

此外,許多手機都約定:這條折線還需要至少經過4個點。

為了描述方便,我們給這9個點從上到下、從左到右依次編號1-9。即如下排列:

1 2 3

4 5 6

7 8 9

那麼1->2->3是非法的,因為長度不足。

1->3->2->4也是非法的,因為1->3穿過了尚未經過的點2。

2->4->1->3->6是合法的,因為1->3時點2已經被劃過了。

某大神已經算出:一共有389112種不同的解鎖方案。沒有任何線索時,要想暴力解鎖確實很難。

不過小hi很好奇,他希望知道,當已經瞥視到一部分折線的情況下,有多少種不同的方案。

遺憾的是,小hi看到的部分折線既不一定是連續的,也不知道方向。

例如看到1-2-3和4-5-6,

那麼1->2->3->4->5->6,1->2->3->6->5->4, 3->2->1->6->5->4->8->9等都是可能的方案。

你的任務是編寫程式,根據已經瞥到的零碎線段,求可能解鎖方案的數目。

輸入:

每個測試資料第一行是乙個整數n(0 <= n <= 8),代表小hi看到的折線段數目。

以下n行每行包含兩個整數 x 和 y (1 <= x, y <= 9),代表小hi看到點x和點y是直接相連的。

輸出:

對於每組資料輸出合法的解鎖方案數目。

例如:

輸入:

8 1 2 2 3

3 4 4 5

5 6 6 7

7 8 8 9

程式應該輸出:

2再例如:

輸入:

4 2 4

2 5

8 5

8 6程式應該輸出:

258

#include 

using namespace std;

bool visit[10]; //記錄是否走過

int no[10][10];

int arr[10][2];

int a[10];//儲存走的路

int n;

int count = 0;

int judge(int x)

if(j > x) //通過上面判斷 當這兩個點不是給定相連的點時 錯誤不滿足題意

return

0; }

return1;}

void dfs(int

step)

for(int i = 1; i <= 9; i++)

a[step] = i;

visit[i] = true;

dfs(step+1);

visit[i] = false;}}

}int main()

for(int i = 1; i <= n; i++)

dfs(1);

cout << count;

return

0;}

滑動解鎖 藍橋模擬賽

思路 暴力搜尋 剪枝。1.如何快速判斷兩個點之間是否隔著其他點?二維陣列打表即可,g x y 表示x和y之間隔著的點,如果沒有則置為0。void init 2.剪枝 如果某條邊 x,y 的兩個端點都被訪問過,但是邊 x,y 和 y,x 都沒有被訪問,那麼後面也不可能訪問到這條邊,那麼剪枝。inclu...

2017藍橋杯模擬題 滑動解鎖(暴力DFS)

滑動解鎖是智慧型手機一項常用的功能。你需要在3x3的點陣上,從任意乙個點開始,反覆移動到乙個尚未經過的 相鄰 的點。這些劃過的點所組成的有向折線,如果與預設的折線在圖案 方向上都一致,那麼手機將解鎖。所謂兩個點 相鄰 當且僅當以這兩個點為端點的線段上不存在尚未經過的點。此外,許多手機都約定 這條折線...

藍橋杯校內模擬賽

1200000有多少個約數 只計算正約數 include using namespace std intmain if i i n ans 1 printf d ans 96 在計算機儲存中,15.125gb是多少mb?include using namespace std intmain 在1至2...