注:该翻译来自《C++,挑战编程——程序设计竞赛进阶训练指南》
题目描述
给定宽度为 2,高度为 1 的若干枚多米诺骨牌,每枚多米诺骨牌牌面上有两个数字。将两枚多米诺骨牌固定放置在一行的两端,在中间留下 n 块宽度为2的空白,再给定 m 枚多米诺骨牌,请问是否可从 m 枚骨牌中选出某些骨牌填满这 n 块空白,并且使得相邻骨牌连接处的数字相同。例如,给定初始骨牌 (0,1) 和 (3,4),中间留有 3 块宽度为 2 的空白,4 枚候选骨牌为 (2,1),(5,2),(2,2),(3,2),则可以按如下方式进行填充:(0,1)(1,2)(2,2)(2,3)(3,4)。
输入格式
本题有多组数据。
每组测试数据的第一行为整数 n,表示空白的块数,接着一行是整数 m,表示候选骨牌的数量,n≤m≤14。接着两行表示两端的固定骨牌,每行包含两个整数,数字出现的顺序为固定骨牌上的数字,顺序为从左至右。接着是 m 行,也是每行包含两个整数,表示候选骨牌上的数字。当 n 为 0 时,输入结束。
输出格式
对于输入中的每组数据,如果存在满足要求的放置方案,输出 YES,否则输出 NO。
**题目描述**
给定宽度为 $2$,高度为 $1$ 的若干枚多米诺骨牌,每枚多米诺骨牌牌面上有两个数字。将两枚多米诺骨牌固定放置在一行的两端,在中间留下 $n$ 块宽度为2的空白,再给定 $m$ 枚多米诺骨牌,请问是否可从 $m$ 枚骨牌中选出某些骨牌填满这 $n$ 块空白,并且使得相邻骨牌连接处的数字相同。例如,给定初始骨牌 $(0, 1)$ 和 $(3, 4)$,中间留有 $3$ 块宽度为 $2$ 的空白,$4$ 枚候选骨牌为 $(2, 1)$,$(5, 2)$,$(2, 2)$,$(3, 2)$,则可以按如下方式进行填充:$(0, 1)(1, 2)(2, 2)(2, 3)(3, 4)$。
**输入格式**
**本题有多组数据**。
每组测试数据的第一行为整数 $n$,表示空白的块数,接着一行是整数 $m$,表示候选骨牌的数量,$n \leq m \leq 14$。接着两行表示两端的固定骨牌,每行包含两个整数,数字出现的顺序为固定骨牌上的数字,顺序为从左至右。接着是 $m$ 行,也是每行包含两个整数,表示候选骨牌上的数字。当 $n$ 为 $0$ 时,输入结束。
**输出格式**
对于输入中的每组数据,如果存在满足要求的放置方案,输出 `YES`,否则输出 `NO`。