蓝桥杯——ALGO-1005——数字游戏

举报
坚持与放弃 发表于 2022/02/23 20:58:47 2022/02/23
【摘要】 资源限制时间限制:1.0s   内存限制:256.0MB问题描述  给定一个1~N的排列a[i],每次将相邻两个数相加,得到新序列,再对新序列重复这样的操作,显然每次得到的序列都比上一次的序列长度少1,最终只剩一个数字。  例如:  3 1 2 4  4 3 6  7 9  16  现在如果知道N和最后得到的数字sum,请求出最初序列a[i],为1~N的一个排列。若有多种答案,则输出字典序最...
资源限制
时间限制:1.0s   内存限制:256.0MB
问题描述
  给定一个1~N的排列a[i],每次将相邻两个数相加,得到新序列,再对新序列重复这样的操作,显然每次得到的序列都比上一次的序列长度少1,最终只剩一个数字。
  例如:
  3 1 2 4
  4 3 6
  7 9
  16
  现在如果知道N和最后得到的数字sum,请求出最初序列a[i],为1~N的一个排列。若有多种答案,则输出字典序最小的那一个。数据保证有解。
输入格式
  第1行为两个正整数n,sum
输出格式
  一个1~N的一个排列
样例输入
4 16
样例输出
3 1 2 4
数据规模和约定
  0<n<=10

代码如下:
import java.util.Scanner;

public class Main {
	static int sum;
	static int N;
	static int arr1[];
	static boolean bool = true;
public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input = new Scanner(System.in);
		N = input.nextInt();
		sum = input.nextInt();
		int array[] = new int[N];
		int visit[] = new int[N + 1];

		dfs(0, array, visit, bool);
}
	public static void dfs(int step, int arr[], int vis[], Boolean b) {
		if (step == N) {
			int arr1[] = new int[N];
			for (int i = 0; i < N; i++) {
				arr1[i] = arr[i];
			}
			for (int i = 1; i < N; i++) {
				for (int j = 0; j < N - i; j++) {
					arr1[j] = arr1[j] + arr1[j + 1];
				}
			}
			if (arr1[0] == sum) {
				for (int x : arr) {
					System.out.print(x + " ");
				}
				bool = false;
				return;

			} else
				return;
		}
		if (bool == true) {
			for (int i = 1; i <= N; i++) {
				if (vis[i] == 0) {
					arr[step] = i;
					vis[i] = 1;
					dfs(step + 1, arr, vis, bool);
					vis[i] = 0;
				}

			}
		}
		return;
	}
}

223-2.png



希望对大家有所帮助!
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。