- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
java解法
每张牌包含值 (val) 和 颜色 (col)。
牌链的规则:
相邻的牌,必须满足值相同或颜色相同。
解题步骤
读取输入
第一行输入为整数数组 vals,代表所有牌的值。
第二行输入为字符串数组 cols,代表所有牌的颜色。
创建 Tile 类
Tile 类存储每张牌的值和颜色。
回溯搜索 (DFS)
采用**回溯 + 深度优先搜索(DFS)**遍历所有可能的排列,计算最长合法链的长度。
变量说明:
vis[]:布尔数组,标记当前牌是否被使用。
prev:表示当前牌链中的上一张牌。
maxChain[0]:存储最长牌链的长度。
递归 search() 方法
遍历所有牌,尝试加入牌链:
如果当前牌 cur 和上一张牌 prev 不符合值或颜色相同的规则,则跳过。
标记 vis[i] = true,递归搜索下一张牌。
回溯 (vis[i] = false),撤销选择,继续搜索其他可能路径。
最终返回 maxChain[0] 作为最长合法牌链的长度
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] vals = Arrays.stream(sc.nextLine().split(" "))
.mapToInt(Integer::parseInt)
.toArray();
String[] cols = sc.nextLine().split(" ");
System.out.println(calc(vals, cols));
}
static class Tile {
int val;
char col;
public Tile(int val, String col) {
this.val = val;
this.col = col.charAt(0);
}
}
public static int calc(int[] vals, String[] cols) {
int len = vals.length;
Tile[] tiles = new Tile[len];
for (int i = 0; i < len; i++) {
tiles[i] = new Tile(vals[i], cols[i]);
}
int[] maxChain = {0};
boolean[] vis = new boolean[len];
search(tiles, vis, null, 0, maxChain);
return maxChain[0];
}
public static void search(Tile[] tiles, boolean[] vis, Tile prev, int len, int[] maxChain) {
maxChain[0] = Math.max(maxChain[0], len);
for (int i = 0; i < tiles.length; i++) {
if (vis[i]) continue;
Tile cur = tiles[i];
if (prev != null && prev.val != cur.val && prev.col != cur.col) continue;
vis[i] = true;
search(tiles, vis, cur, len + 1, maxChain);
vis[i] = false;
}
}
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
C++解法
更新中
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
C解法
-
解题思路
-
该程序的目的是计算最长的连续牌链,其中:
每张牌包含数字 (num) 和 颜色 (color)。
牌链的规则:
相邻的牌,必须满足数字相同或颜色相同。
解题步骤
读取输入
先读取一行整数,表示牌的数字,存入 cards[i].num。
然后读取一行字符,表示牌的颜色,存入 cards[i].color。
深度优先搜索(DFS)
使用 bfs()(其实是递归深度优先搜索,函数命名 bfs 可能是误导)。
变量说明:
used[]:布尔数组,标记当前牌是否被使用。
lastCard:表示当前牌链中的上一张牌。
maxCount:存储最长牌链的长度。
递归 bfs() 计算最长合法牌链
遍历所有牌:
如果当前牌 current 和 lastCard 不符合数字或颜色相同的规则,则跳过。
标记 used[i] = 1,递归搜索下一张牌。
回溯 (used[i] = 0),撤销选择,继续搜索其他可能路径。
最终返回 maxCount 作为最长合法牌链的长度
#include
#include
#define MAX_SIZE 10
typedef struct {
int num;
char color;
} Card;
int maxCount = 0;
Card cards[MAX_SIZE];
int cardsSize = 0;
void dfs(int used[], Card* lastCard, int count);
int main() {
while (scanf("%d", &cards[cardsSize].num)) {
cardsSize++;
if (getchar() != ' ') break;
}
for (int i = 0; i < cardsSize; i++) {
cards[i].color = (char)getchar();
getchar();
}
int used[MAX_SIZE] = {0};
dfs(used, NULL, 0);
printf("%d\n", maxCount);
return 0;
}
void dfs(int used[], Card* lastCard, int count) {
if (count > maxCount) {
maxCount = count;
}
for (int i = 0; i < cardsSize; i++) {
if (used[i]) continue;
Card current = cards[i];
if (lastCard == NULL || lastCard->num == current.num || lastCard->color == current.color) {
used[i] = 1;
dfs(used, ¤t, count + 1);
used[i] = 0;
}
}
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
JS解法
更新中
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
注意:
如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏
评论记录:
回复评论: