蓝桥杯算法训练 ——排列问题
Description
求一个0~N-1的排列(即每个数只能出现一次),给出限制条件(一张N*N的表,第i行第j列的1或0,表示为j-1这个数不能出现在i-1这个数后面,并保证第i行第i列为0),将这个排列看成一个自然数,求从小到大排序第K个排列。
Input
输入描述:
N<=10,K<=500000
输入样例:
Output
输出描述:
第一行为N和K,接下来的N行,每行N个数,0表示不能,1表示能
输出样例:
向大佬学习
https://www.cnblogs.com/fx1998/p/12691947.html
https://blog.csdn.net/a1439775520/article/details/93139756
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Collections;
import java.util.LinkedList;public class 排列问题 {private static int vis[][];private static int count = 0, m;private static LinkedList<String> queue = new LinkedList<String>();public static void main(String[] args) throws IOException {StreamTokenizer st = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));st.nextToken();int n = (int) st.nval;st.nextToken();m = (int) st.nval;int arr[] = new int[n];vis = new int[n][n];for (int i = 0; i < n; i++) {arr[i] = i;//生成0~n-1的序列for (int j = 0; j < n; j++) {st.nextToken();vis[i][j] = (int) st.nval;}}allsort(arr, 0);Collections.sort(queue);System.out.println(queue.get(m - 1));}private static void allsort(int arr[], int k) {if (arr.length == k) {int ok = 0;String str = "";for (int i = 0; i < arr.length - 1; i++) {//遍历这个全排列,看看是否存在某个数不能紧贴在某个数后面的情况if (vis[arr[i]][arr[i + 1]] == 0) {ok = 1;return;}str += arr[i] + " ";}if (ok == 0) {queue.add(str + arr[k - 1]);}return;}int tmp;for (int i = k; i < arr.length; i++) {tmp = arr[i];arr[i] = arr[k];arr[k] = tmp;allsort(arr, k + 1);tmp = arr[i];arr[i] = arr[k];arr[k] = tmp;}}}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
