蓝桥杯 排列序数 2014年JavaB组决赛第4题

标题:排列序数

如果用a b c d这4个字母组成一个串,有4!=24种,如果把它们排个序,每个串都对应一个序号:

abcd  0

abdc  1

acbd  2

acdb  3

adbc  4

adcb  5

bacd  6

badc  7

bcad  8

bcda  9

bdac  10

bdca  11

cabd  12

cadb  13

cbad  14

cbda  15

cdab  16

cdba  17

...

现在有不多于10个两两不同的小写字母,给出它们组成的串,你能求出该串在所有排列中的序号吗?

【输入格式】

一行,一个串。

【输出格式】

一行,一个整数,表示该串在其字母所有排列生成的串中的序号。注意:最小的序号是0。

例如:

输入:

bdca

程序应该输出:

11

再例如:

输入:

cedab

程序应该输出:

70

资源约定:

峰值内存消耗(含虚拟机) < 256M

CPU消耗  < 1000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。

注意:主类的名字必须是:Main,否则按无效代码处理。

不理解或者需要交流的同学可以粉我新浪微博@雷锹,私信哟!!!

每题都写思路效率太低了,有需要或者是实在不明白去我微博私信一下我更新博客

package com.jueshai2014;

import java.util.Arrays;
import java.util.Scanner;

public class _4 {
	public static char [] array;
	public static boolean flag [];
	public static char[] all_P ;
	public static int count = 0;
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan = new Scanner(System.in);
		String string = scan.next();
		array = string.toCharArray();
		Arrays.sort(array);
		flag= new boolean[array.length];
		all_P = new char[array.length];
		dfs(0,string);
	}
	private static void dfs(int n,String string) {
		// TODO Auto-generated method stub
		if(n == array.length){
			if(string.equals(String.valueOf(all_P))){
				System.out.println(count);
			}
//			System.out.println(String.valueOf(all_P)+ " " + count);
			count++;
			return;
		}
		for(int i = 0; i < array.length; i++){
			if(!flag[i]){
				flag[i] = true;
				all_P[n] = array[i];
				dfs(n+1, string);
				flag[i] = false;
			}
		}
	}

}
时间: 2024-11-10 01:24:45

蓝桥杯 排列序数 2014年JavaB组决赛第4题的相关文章

蓝桥杯 幂一矩阵 2014年JavaB组决赛第5题

标题:幂一矩阵 天才少年的邻居 atm 最近学习了线性代数相关的理论,他对"矩阵"这个概念特别感兴趣.矩阵中有个概念叫做幂零矩阵.对于一个方阵 M ,如果存在一个正整数 k 满足 M^k = 0 ,那么 M 就是一个幂零矩阵.(^ 表示乘方) atm 不满足幂零矩阵,他自己设想了一个幂一矩阵:对于一个方阵 M ,如果存在一个正整数 k 满足 M^k = I ,其中 I 是单位矩阵,那么 M 就是一个幂一矩阵. atm 特别钟情于这样一种方阵:每行每列有且仅有一个 1 .经过 atm 不

2015年第六届蓝桥杯C/C++程序设计本科B组决赛 ——居民集会(编程大题)

标题:居民集会 蓝桥村的居民都生活在一条公路的边上,公路的长度为L,每户家庭的 位置都用这户家庭到公路的起点的距离来计算,第i户家庭距起点的距 离为di.每年,蓝桥村都要举行一次集会.今年,由于村里的人口太多,村委 会决定要在4个地方举行集会,其中3个位于公路中间,1个位最公路 的终点. 已知每户家庭都会向着远离公路起点的方向去参加集会,参加集会的 路程开销为家庭内的人数ti与距离的乘积. 给定每户家庭的位置di和人数ti,请为村委会寻找最好的集会举办地 :p1, p2, p3, p4 (p1<

2016年第七届蓝桥杯C/C++程序设计本科B组决赛

2.答案300 刁丝卫代码,比赛时long long写成int,结果成了263...一等擦肩而过... #include <iostream> #include <fstream> #include <cstring> #define LL long long using namespace std; bool mark[100]; LL res[100],sum=0; bool tmpmark[10]; bool judge(LL x){ memset(tmpmark

2012年第三届蓝桥杯C/C++程序设计本科B组决赛

1.星期几[结果填空] (满分5分)    1949年的国庆节(10月1日)是星期六.     今年(2012)的国庆节是星期一.    那么,从建国到现在,有几次国庆节正好是星期日呢? 只要答案,不限手段!    可以用windows日历,windows计算器,Excel公式,.....    当然,也可以编程!    不要求写出具体是哪些年,只要一个数目!    千万不要提交源代码!    答案不要写在这里,写在“解答.txt”中 答案:9 s.主要是取余的使用 #include<iostr

2014年第五届蓝桥杯试题C/C++程序设计B组——奇怪的分式

题目描述: 标题:奇怪的分式 上小学的时候,小明经常自己发明新算法.一次,老师出的题目是: 1/4 乘以 8/5 小明居然把分子拼接在一起,分母拼接在一起,答案是:18/45 (参见图1.png) 老师刚想批评他,转念一想,这个答案凑巧也对啊,真是见鬼! 对于分子.分母都是 1~9 中的一位数的情况,还有哪些算式可以这样计算呢? 请写出所有不同算式的个数(包括题中举例的). 显然,交换分子分母后,例如:4/1 乘以 5/8 是满足要求的,这算做不同的算式. 但对于分子分母相同的情况,2/2 乘以

2014年第五届蓝桥杯试题C/C++程序设计B组——打印图像

题目描述:标题:打印图形 小明在X星球的城堡中发现了如下图形和文字:rank=3 rank=5 ran=6 小明开动脑筋,编写了如下的程序,实现该图形的打印. 程序代码: #define N 70 void f(char a[][N], int rank, int row, int col){ //rank等于1的情形 if(rank==1){ a[row][col] = '*'; return; } int w = 1; int i; for(i=0; i<rank-1; i++) w *=

2014年第五届蓝桥杯试题C/C++程序设计B组——史丰收速算

题目描述 史丰收速算法的革命性贡献是:从高位算起,预测进位.不需要九九表,彻底颠覆了传统手算! 速算的核心基础是:1位数乘以多位数的乘法. 其中,乘以7是最复杂的,就以它为例. 因为,1/7 是个循环小数:0.142857...,如果多位数超过 142857...,就要进1 同理,2/7, 3/7, ... 6/7 也都是类似的循环小数,多位数超过 n/7,就要进n 下面的程序模拟了史丰收速算法中乘以7的运算过程. 乘以 7 的个位规律是:偶数乘以2,奇数乘以2再加5,都只取个位. 乘以 7 的

2014年第五届蓝桥杯试题C/C++程序设计B组——李白打酒

题目描述: 标题:李白打酒 话说大诗人李白,一生好饮.幸好他从不开车. 一天,他提着酒壶,从家里出来,酒壶中有酒2斗.他边走边唱: 无事街上走,提壶去打酒. 逢店加一倍,遇花喝一斗. 这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了. 请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b.则:babaabbabbabbbb 就是合理的次序.像这样的答案一共有多少呢?请你计算出所有可能方案的个数(包含题目给出的). 注意:通过浏览器提交答案.答案是个整数.不

2016蓝桥杯省赛C/C++A组第二题 跳蚱蜢

题意:有9只盘子,排成1个圆圈.  其中8只盘子内装着8只蚱蜢,有一个是空盘. 我们把这些蚱蜢顺时针编号为 1~8 每只蚱蜢都可以跳到相邻的空盘中,也可以再用点力,越过一个相邻的蚱蜢跳到空盘中.  请你计算一下,如果要使得蚱蜢们的队形改为按照逆时针排列,  并且保持空盘的位置不变(也就是1-8换位,2-7换位,...),至少要经过多少次跳跃?  注意:要求提交的是一个整数,请不要填写任何多余内容或说明文字. 分析:结果是20. #include<bits/stdc++.h> using nam