在2行5列的格子中填入1到10的数字。 要求: 相邻的格子中的数,右边的大于左边的,下边的大于上边的。

如【图1.png】所示的2种,就是合格的填法。
请你计算一共有多少种可能的方案。
请提交该整数,不要填写任何多余的内容(例如:说明性文字)。(答案:42)

 public class Main{

     static int sum = 0;

     public static void main(String[] args){
int[] num = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
sort(num, 1);
System.out.println(sum);
} // 全排列10个数字
public static void sort(int[] str, int start){
for(int i = start; i < str.length-1; i++){
if(i>start){
jiaohuan(str, start, i);
}
if(start == str.length-2){
// 输出初始状态
bianli(str); // abc
// 交换后两位,并输出
jiaohuan(str, str.length-1, str.length-2);
bianli(str); // acb
// 复位第16行
jiaohuan(str, str.length-1, str.length-2);//恢复到abc
return;
}else{
sort(str, start+1);
}
if(i>start){
jiaohuan(str, start, i);
}
}
} public static void bianli(int[] arr){
if(arr[0]<arr[1] && arr[1]<arr[2] && arr[2]<arr[3] && arr[3]<arr[4]
&& arr[5]<arr[6] && arr[6]<arr[7] && arr[7]<arr[8] && arr[8]<arr[9]
&& arr[0]<arr[5]&& arr[1]<arr[6] && arr[2]<arr[7] && arr[3]<arr[8] && arr[4]<arr[9]){
sum++;
}
} public static void jiaohuan(int[] arr, int a, int b){
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
}

这道题使用了全排列来解题!关于全排列,我使用如下的方式来总结:

 public class Demo01{

     static int num = 0;

     public static void main(String[] args){
String[] str = {"a", "b", "c"};
// PaiLie(str);
// PaiLie000000(str, 0); String[] str1 = {"a", "b", "c", "d"};
// PaiLie11(str1, 0);
// PaiLie000000(str1, 0); String[] str2 = {"a", "b", "c", "d", "e"};
// PaiLie22(str2);
PaiLie000000(str2, 0); } //a b
public static void PaiLie00(String[] arr,int start){
for(int i= start; i<arr.length; i++){
if(i>start){
JiaoHuan(arr, start, i);
}
// ÏÔʾbac
BianLi(arr);
if(i>start){
JiaoHuan(arr, start, i);
}
}
} // a b c
public static void PaiLie(String[] arr, int start){
for(int i= start; i<arr.length; i++){
if(i>start){
JiaoHuan(arr, start, i);
}
PaiLie00(arr, start+1);
if(i>start){
JiaoHuan(arr, start, i);
}
}
} // a b c d
public static void PaiLie11(String[] arr, int start){
for(int i= start; i<arr.length; i++){
if(i>start){
JiaoHuan(arr, start, i);
}
PaiLie(arr, start+1);
if(i>start){
JiaoHuan(arr, start, i);
}
}
} // a b c d e
public static void PaiLie22(String[] arr){
for(int i= 0; i<arr.length; i++){
if(i>0){
JiaoHuan(arr, 0, i);
}
PaiLie11(arr, 1);
if(i>0){
JiaoHuan(arr, 0, i);
}
}
} public static void PaiLie000000(String[] arr, int start){
for(int i= start; i<arr.length; i++){
if(i>start){
JiaoHuan(arr, start, i);
}
if(start==arr.length-1){
BianLi(arr);
return;
}
PaiLie000000(arr, start+1);
if(i>start){
JiaoHuan(arr, start, i);
}
}
} public static void BianLi(String[] arr){
num++;
System.out.print(num+": ");
for(int i = 0; i< arr.length; i++){
System.out.print(arr[i]+"\t");
}
System.out.println();
} public static void JiaoHuan(String[] arr, int a, int b){
String temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
}

搞懂了全排列,这道题就很简单了,下边的题目也是类似的:

看这个算式: ☆☆☆ + ☆☆☆ = ☆☆☆
如果每个五角星代表 1 ~ 9 的不同的数字。
这个算式有多少种可能的正确填写方法?
    295 + 173 = 468
    173 + 295 = 468
    183 + 492 = 675
以上都是正确的填写法!
    注意:
    111 + 222 = 333 是错误的填写法!
    因为每个数字必须是不同的! 
    也就是说:1~9中的所有数字,每个必须出现且仅出现一次!

 

方格填数-2015决赛C语言A组第一题的更多相关文章

  1. 机器人数目-2015决赛Java语言C组第一题

    标题:机器人数目 少年宫新近邮购了小机器人配件,共有3类,其中,A类含有:8个轮子,1个传感器B类含有: 6个轮子,3个传感器C类含有:4个轮子,4个传感器 他们一共订购了100套机器人,收到了轮子6 ...

  2. 胡同门牌号-2015决赛Java语言A组第一题

    标题:胡同门牌号 小明家住在一条胡同里.胡同里的门牌号都是连续的正整数,由于历史原因,最小的号码并不是从1开始排的.有一天小明突然发现了有趣的事情:如果除去小明家不算,胡同里的其它门牌号加起来,刚好是 ...

  3. 分机号-2015决赛C语言C组第一题

    标题:分机号 X老板脾气古怪,他们公司的电话分机号都是3位数,老板规定,所有号码必须是降序排列,且不能有重复的数位.比如: 751,520,321 都满足要求,而, 766,918,201 就不符合要 ...

  4. 积分之迷-2015决赛C语言B组第一题

    标题:积分之迷 小明开了个网上商店,卖风铃.共有3个品牌:A,B,C. 为了促销,每件商品都会返固定的积分. 小明开业第一天收到了三笔订单: 第一笔:3个A + 7个B + 1个C,共返积分:315 ...

  5. 方程整数解-2015省赛C语言A组第一题

    方程整数解 方程: a^2 + b^2 + c^2 = 1000(或参见[图1.jpg])这个方程有整数解吗?有:a,b,c=6,8,30 就是一组解.你能算出另一组合适的解吗? 请填写该解中最小的数 ...

  6. java算法 蓝桥杯(题+答案) 方格填数

    6.方格填数  (结果填空) 如下的10个格子 (如果显示有问题,也可以参看[图1.jpg]) 填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻) 一共有多少种可能的填数方案 ...

  7. 蓝桥杯比赛javaB组练习《方格填数》

    方格填数 如下的10个格子   +--+--+--+   |  |  |  |+--+--+--+--+|  |  |  |  |+--+--+--+--+|  |  |  |+--+--+--+ ( ...

  8. java算法 第七届 蓝桥杯B组(题+答案) 6.方格填数

    6.方格填数  (结果填空) 如下的10个格子 (如果显示有问题,也可以参看[图1.jpg]) 填入0~9的数字.要求:连续的两个数字不能相邻.(左右.上下.对角都算相邻) 一共有多少种可能的填数方案 ...

  9. c++_方格填数(最新方法)

      方格填数 如下的10个格子 +--+--+--+ | | | |+--+--+--+--+| | | | |+--+--+--+--+| | | |+--+--+--+ (如果显示有问题,也可以参 ...

随机推荐

  1. ASP.NET MVC一次删除多笔记录 V2.0

    前一段时间Insus.NET有写一篇<ASP.NET MVC一次删除多笔记录>http://www.cnblogs.com/insus/p/6241186.html 可以前往去看看. 觉得 ...

  2. 背水一战 Windows 10 (59) - 控件(媒体类): Image, MediaElement

    [源码下载] 背水一战 Windows 10 (59) - 控件(媒体类): Image, MediaElement 作者:webabcd 介绍背水一战 Windows 10 之 控件(媒体类) Im ...

  3. jQuery ajax 302跨域

    一.ajax 302 ajax用于异步获取服务器数据,但是某天有这么一个使用场景: > 基于安全考虑,登录的用户的信息失效时,系统的所有ajax接口都由服务器直接重定向到系统的登录页面,此时登录 ...

  4. dubbo实现原理之SPI简介

    dubbo采用微内核+插件体系,设计优雅,扩展性很强.微内核+插件体系是如何实现的呢?想必大家都知道SPI(service provider interface)机制.这种机制的原理是假如我们定义了服 ...

  5. Linux 中指定启动 tomcat 的 jdk 版本

    环境: RHEL6.5. tomcat8.5.jdk1.8.0_181 修改 catalina.sh.setclasspath.sh 文件 进入目录 $ cd /data01/server/apach ...

  6. linux shell使用别名,切换当前目录

    别名alias 别名就是一种快捷方式,以省去用户输入一长串命令序列的麻烦. 别名使用alias命令 比如 alias cp='cp -i' alias l.='ls -d .* --color=tty ...

  7. vue教程2-04 vue实例简单方法

    vue教程2-04 vue实例简单方法 vue实例简单方法: vm.$el -> 就是元素 vm.$data -> 就是data <!DOCTYPE html> <htm ...

  8. HTTP响应状态码 含义

    100 客户端可以继续 101 指示服务器正根据 Upgrade 头切换协议 200 请求正常成功 201 指示请求成功并在服务器上创建了一个新资源 202 指示已接受请求进行处理但处理尚未完成 20 ...

  9. (转)【深度长文】循序渐进解读Oracle AWR性能分析报告

    原文:https://dbaplus.cn/news-10-734-1.html https://blog.csdn.net/defonds/article/details/52958303 作者介绍 ...

  10. mysql基础知识(3)

    十六.组合查询 使用 union 来组合查询,如果第一个查询返回M行,第二个查询返回N行,那么组合查询的结果一般为 M+N 行. 注意:每个查询必须包含相同的行.表达式的聚集函数:默认会去除相同行.表 ...