算法分析与设计——递归(2)比赛问题

2026-08-31 15:38:46 照明科技发展

NBA 季后赛中,我们总是安排较强的队伍对战较弱的队伍。例如,用排名第 1 的队伍和第 n 的队伍对决,这是一个可以让比赛更加有趣的好策略。现在,给你 n 支队伍,你需要以字符串格式输出它们的 最终 比赛配对。在每一轮的匹配过程中,你都需要遵循 将强队与弱队配对 的原则。比如输入4,输出((1,4),(2,3))每个括号表示一组对决

问题描述在 NBA 季后赛中,我们总是安排较强的队伍对战较弱的队伍。例如,用排名第 1 的队伍和第 n 的队伍对决,这是一个可以让比赛更加有趣的好策略。现在,给你 n 支队伍,你需要以字符串格式输出它们的 最终 比赛配对。在每一轮的匹配过程中,你都需要遵循 将强队与弱队配对 的原则。

输入格式输入一个正整数n(n>1),代表n 支队伍按从 1 到 n 的正整数格式给出,分别代表它们的初始排名(排名 1 最强,排名 n 最弱)。

输入样例4

输出格式用括号和逗号来表示匹配对——括号表示匹配,逗号来用于分割。

输出样例((1,4),(2,3))

注: 在第一轮,我们将队伍1和4配对,2和3配对,以满足将强队和弱队搭配的效果。 得到(1,4),(2,3). 在第二轮,(1,4) 和 (2,3) 的赢家需要进行比赛以确定最终赢家, 因此需要再在外面加一层括号。 于是最终答案是((1,4),(2,3))。

解题思路也是个典型的递归问题,是个逐层递归的题,从1可以扩展到(1,2)。括号里的每一个数再各自扩展成(1,4),(2,3),扩展的结果和当前扩展目标和当前数有关,比如从2层扩展到4层,与1相匹配的数就是(4+1)-1 ,与2相配的数就是(4+1)-2

解题步骤

逐层构建方法解决问题。

构建方法,如果当前数字为1,则返回1,此乃递归出口,表示在第一层只有1。否则递归,参数为当前数字的1/2的。

构建方法,参数是当前序列,扩展层数。

构建方法,当前数字,扩展层数,这一步负责将每个需要扩展的数变成扩展目标。

解题代码import java.util.Scanner;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class gameOrder {

public static void main(String[] args){

Scanner scan = new Scanner(System.in);

int n = scan.nextInt();

String res = new String();

System.out.print(order(n,res));

}

public static String order(int n , String str){

if (n==1){

return "1";

}

return enlarge(order(n/2,str),n);

}

public static String enlarge(String str, int num){

int n = num/2;

int i =n;

while (i!=0){

String pattern = "\\b"+i+"\\b";

Pattern r = Pattern.compile(pattern);

Matcher m = r.matcher(str);

str = m.replaceFirst(getlarge(i,num));

i--;

}

return str;

}

public static String getlarge(int num1, int n){

return "(" + num1 + "," + (n + 1 - num1) + ")";

}

}

最新发表
友情链接