OJ 7222 懷錶問題 深搜

2021-07-26 21:49:31 字數 2096 閱讀 1282

懷錶是由乙個錶鏈和乙個表盤連線而成的。同時,錶鏈又是由多個長度為1的錶鏈元件連線而成的。小明現有乙個表盤和多個長度為1的錶鏈元件。他希望組合成乙個完整的懷錶當做生日禮物送給爸爸。

表盤和錶鏈元件的兩端都有表扣可以和其它的錶鏈元件或者表盤相連。 一共有兩種錶扣設計,分別是「l」 和「v」。錶鏈元件和表盤的左右兩端可以使用相同的或者不同的錶扣設計,因此我們有以下四種不同的錶鏈元件和表盤設計方式,「ll」, 「lv」, 「vl」, 「vv」,如「lv」表示左端的錶扣設計是」l」, 右端的錶扣設計是「v」。另,表盤和錶鏈是不允許上下左右翻轉的。如果把兩個錶鏈元件或者乙個錶鏈元件和表盤相連線,那麼相連部分的錶扣設計必須一致。此外,還必須確保表盤可以連線到錶鏈的任意一端。

例子1:表盤是「lv」,共有5個錶鏈元件分別是,「ll」, 「ll」, 「lv」, 「vl」, 「vl」 。現在希望組合成長度為4的懷錶(錶鏈長度是4)。 有兩種正確的錶鏈組合方式:「vllllvvl」 和「vllvvlll」。而且,對於每一種錶鏈的組合方式,表盤都可以連線到錶鏈的左右兩端 (表盤放到錶鏈左端使用v相連,表盤放到錶鏈右端使用l相連)。

例子2: 表盤是「ll」,共有4個錶鏈元件分別是,「ll」, 「lv」, 「vl」, 「vv」。現在希望組合成長度為3的懷錶(錶鏈長度是3)。有三種正確的錶鏈組合方式:「lllvvl」, 「lvvlll」和「lvvvvl」。而且,對於每一種錶鏈的組合方式,表盤都可以接到錶鏈的任一端。

注意懷錶的組合方式可能不唯一。每一種錶鏈的組合方式都可以當做是乙個由」l」和「v」

組成的字串。如果兩種錶鏈對應的字串是不匹配的, 那麼錶鏈也是不相同的。

標準的輸入包含若干組測試資料。每組資料第一行是整數n (0 < n ≤ 40)和k (0 < k ≤ n) 。

n 代表錶鏈元件的個數,k代表要組合成的懷錶長度(錶鏈元件的個數)。 接著的n+ 1 行描述表盤(第二行)和錶鏈元件的錶扣設計。有四種可能輸入: 「lv」, 「ll」, 「vv」 和「vl」。

對於每組測試資料,輸出一行。 輸出「yes」, 如果可能按照要求組合成懷錶,並輸出可能的組合方式的數目。如果不能,則輸出」no」.

4 4

lv ll

lv vl

vl 4 4

vl ll

lv vl

vl

yes

2 no

在網上看到一種有意思的解法,每種錶鏈數用位數存於乙個數字中,四種錶鏈存在乙個2bit的數字中,解法數目通過錶扣搭配一一嘗試,最終得到解,詳細過程請看注釋。

#include 

#include

using

namespace

std;

#define code(ch) ((ch[0] == 'l') << 1 | (ch[1] == 'l')) //錶鏈的編碼方案。

#define link(a, b) ((a & 1) == (b >> 1))

int c[4], dial; //vv, vl, lv, ll

int k;

char visited[2560001];

long

long num[2560001]; //最大40 * 40 * 40 * 40 + 1

char defaultvalue = 0;

//手鍊一頭為head,表盤扣為dial時錶鏈數目為count。

long

long dfs(int code, int head, int count)

if (code / 1600 % 40 && link(head, 1))

if (code / 40 % 40 && link(head, 2))

if (code % 40 && link(head, 3))

return value;

}int main()

long

long result = dfs(c[0] * 64000 + c[1] * 1600 + c[2] * 40 + c[3], dial, 0);

result ? printf("yes\n%lld\n", result) : printf("no\n");

}return

0;}

oj 深搜 回溯(3)

求幾個數的全排列 include include using namespace std intmap 100 假設排列數的個數最多為100 int n 實際個數 int q 多少種不同的數 int icount 100 存放每種不同的數的個數。陣列大小由q決定 int itable 100 存放一...

迷宮問題 深搜

簡單的實現了迷宮 深搜 並非是最短路徑 我們規定 1 為牆,0 為通路。為了避免越界,在迷宮外面加了一堵牆。當然也可以不需要牆。實現很簡單,用乙個陣列棧儲存已訪問過的位置,用四個if語句判斷東南西北四個方向能否走通。若往前已無路可走便退回上乙個位置。具體實現如下 include include de...

迷宮問題(深搜

d 迷宮問題 crawling in process.crawling failed time limit 1000msmemory limit 65536kb64bit io format i64d i64u submit status description 定義乙個二維陣列 int maze ...