题目描述
package odjava;
import java.util.Arrays;
import java.util.Scanner;
public class 六_连续出牌数量 {
// 定义扑克牌类
static class Card {
int num; // 牌号
char color; // 花色
public Card(int num, String color) {
this.num = num;
this.color = color.charAt(0); // 取花色字符串的第一个字符
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取输入的牌号和花色
int[] nums = Arrays.stream(scanner.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
String[] colors = scanner.nextLine().split(" ");
// 输出结果
System.out.println(getResult(nums, colors));
}
/**
* 获取连续出牌的最大数量
*
* @param nums 牌号数组
* @param colors 花色数组
* @return 连续出牌的最大数量
*/
public static int getResult(int[] nums, String[] colors) {
int n = nums.length;
Card[] cards = new Card[n];
for (int i = 0; i < n; i++) cards[i] = new Card(nums[i], colors[i]);
int[] ans = {0}; // 用于记录连续出牌的最大数量
boolean[] used = new boolean[n]; // 用于记录牌是否被使用过
dfs(cards, used, null, 0, ans); // 调用深度优先搜索函数计算结果
return ans[0];
}
/**
* 深度优先搜索函数,用于计算连续出牌的最大数量
*
* @param cards 牌数组
* @param used 记录牌是否被使用过的数组
* @param last 上一张牌
* @param count 当前连续出牌的数量
* @param ans 用于记录连续出牌的最大数量的数组
*/
public static void dfs(Card[] cards, boolean[] used, Card last, int count, int[] ans) {
ans[0] = Math.max(ans[0], count); // 更新连续出牌的最大数量
// 遍历每一张牌
for (int i = 0; i < cards.length; i++) {
if (used[i]) continue; // 如果这张牌已经被使用过,则跳过
Card cur = cards[i]; // 当前考虑的牌
if (last != null && last.num != cur.num && last.color != cur.color) continue; // 如果当前牌与上一张牌不相同,则跳过
used[i] = true; // 标记当前牌已被使用
dfs(cards, used, cur, count + 1, ans); // 继续搜索下一张牌
used[i] = false; // 恢复当前牌的状态,以便尝试其他可能性
}
}
}