该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

这是我写的,但是算法很复杂,唉,求高手啊

package com.sky.woodwall;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.HashSet;

import java.util.List;

import java.util.Set;

public class

CalculateClass{

//用于填充方块的元素,支持任意图形,1代表此位置有填充物,0代表此处是空的

private static int[][][] blocks = {

{{1}},//表示基本方块

{{1,1}},//表示横着2格长度的方块

{{1},{1}},//表示竖着2格长度的方块

//{{1,0,1},{1,1,1}}//表示凹字的方块

};

//用于保存每种方案的步骤

private static List list=new

ArrayList();

//根据n和k计算填充方案的方法

public static int calculate(int n, int k) {

int[][] wall=new int[k][2*n];

//开始填充

run(wall,"");

//去掉方案中有重复项的方案

removeDuplicate(list);

return list.size();

}

private static void run(int[][] wall,String

steps){

for(int i=0;i

//每次循环都必须和参数中的wall一致。

int[][] annotherWall=copy(wall);

//进行填充操作并记录步骤

String step = fill(annotherWall, blocks[i]);

if(step==null){

if(isFillFull(annotherWall)) {

list.add(steps);

break;

}

}else{

//递归

run(annotherWall,steps+step+"\n");

}

}

}

//拷贝二维数组

private static int[][] copy(int[][] wall){

int[][] temp=new int[wall.length][];

for(int i=0;i

temp[i]=Arrays.copyOf(wall[i],

wall[i].length);

}

return temp;

}

//判断是否填满

private static boolean isFillFull(int[][]

wall){

for(int i=0;i

for(int j=0;j

if(wall[i][j]==0) return false;

}

}

return true;

}

//将指定的填充方块填入墙面中

private static String fill(int[][]

wall,int[][] block){

int[] position = getPosition(wall, block);

if (position[0]==-1) {

return null;

}

String step="将"+sysout(block)+"插入"+sysout(position)+"坐标位置";

for(int m=0;m

for(int n=0;n

if(block[m][n]==1){

wall[position[0]+m][position[1]+n]=1;

}

}

}

return step;

}

//计算填充的起始点

private static int[] getPosition(int[][]

wall,int[][] block){

int[] startPosition={-1,-1};

for(int i=0;i

for(int j=0;j

if(wall[i][j]==1) continue;

boolean error=false;

for(int m=0;m

for(int n=0;n

if(block[m][n]==1 &&

(i+m)

if(startPosition[0]==-1){

startPosition=new int[]{i,j};

}

}else{

error=true;

break;

}

}

if(error) break;

}

if(!error) return startPosition;

else {

startPosition=new int[]{-1,-1};

}

}

}

return startPosition;

}

//去除重复的步骤

private static void

removeDuplicate(List strList){

Set set=new

HashSet();

for (String str1 : strList) {

String[] split = str1.split("\n");

Arrays.sort(split);

set.add(Arrays.toString(split));

}

list=new ArrayList(set);

}

private static String sysout(int[][] temp){

StringBuilder sb=new StringBuilder();

for (int[] is : temp) {

sb.append(sysout(is)).append(",");

}

return

sb.length()>0?sb.substring(0,sb.length()-1):sb.toString();

}

private static String sysout(int[] is) {

//System.out.println(Arrays.toString(is));

return Arrays.toString(is);

}

// start 提示:自动阅卷起始唯一标识,请勿删除或增加。

public static void main(String args[]) {

int calculate = calculate(1, 2);

System.out.println("总共的方案一共有"+calculate+"种。");

for (String string : list) {

System.out.println(string);

}

}

// end //提示:自动阅卷结束唯一标识,请勿删除或增加。

}

java算法编程题_【java题目】考验你编程能力和算法的时候到了相关推荐

  1. Java编程题_面向对象和常用API01_B级

    Java编程题_面向对象和常用API01_B级 第1题 面向对象.异常.集合.IO 题干: 请编写程序,完成键盘录入学生信息,并计算总分将学生信息与总分一同写入文本文件 需求:键盘录入3个学生信息(姓 ...

  2. 剑指offer编程题(JAVA实现)——第35题:数组中的逆序对

    github https://github.com/JasonZhangCauc/JZOffer 剑指offer编程题(JAVA实现)--第35题:数组中的逆序对 题目描述 在数组中的两个数字,如果前 ...

  3. 剑指offer编程题(JAVA实现)——第38题:二叉树的深度

    github https://github.com/JasonZhangCauc/JZOffer 剑指offer编程题(JAVA实现)--第38题:二叉树的深度 题目描述 输入一棵二叉树,求该树的深度 ...

  4. java猜字母游戏_JAVA编程题-用java编写猜字母游戏

    原标题:JAVA编程题-用java编写猜字母游戏 问题: 猜字母游戏,其游戏规则为: 程序随机产生5个按照一定顺序排列的字符作为猜测的结果,由玩家来猜测此字符串.玩家可以猜测多次,每猜测一次,则由系统 ...

  5. 环评师c语言题目,C语言考试——编程题_文库吧

    C语言考试--编程题_文库吧 2020-09-27 08:21:23 [导读]该数本身,比如153=13+53+33,故153是水仙花数).要求将判断某数是否素数的功.能编成一个独立的函数,然后在ma ...

  6. Linux环境编程姜林美,Linux环境编程习题_编程题_答案.pdf

    Linux环境编程习题_编程题_答案 Linux 境编程-人民邮电出版社-姜林美 课后习题(编程题)答案 第三章 1 第五章 4 第六章 9 第七章 19 第八章 22 第九章 35 第十章 38 三 ...

  7. 算法百题斩其三: 单源最短路与算法——其一

    算法百题斩其三: 单源最短路与算法--其一 写在前面:何所谓"斩"? 斩,即快速而有力地切断,指我们用最精简的语言,一针见血地点破算法题的核心难点.斩需三思而后行:斩需借助外力.旁 ...

  8. c语言编程题大学,大学C语言程序设计(编程题).pdf

    C 语言程序设计习题(编程题) C 语言程序设计习题(编程题) 习题1(编程题)[知识点:基础知识] 2 2 2 2 编制程序,要求输入整数a 和b ,若a +b 大于100,则输出a +b 百位以上 ...

  9. java在线编程题_阿里笔试题(2017在线编程题)-- 数串分组 --Java实现

    看到有人写了阿里的面试题,心里痒痒,好久 没搞过这些了,写着实现一下 题目 2017年3月阿里在线编程题(实习内推) 给定一串数字 判断是否存在这三个元素,它们将数字串分为四个子串,其中每个子串的数字 ...

  10. java 编程题_最新JAVA编程题全集(50题及答案)92862

    <最新JAVA编程题全集(50题及答案)92862>由会员分享,可在线阅读,更多相关<最新JAVA编程题全集(50题及答案)92862(32页珍藏版)>请在人人文库网上搜索. ...

最新文章

  1. 基于纯Java代码的Spring容器和Web容器零配置的思考和实现(3) - 使用配置
  2. mdcsoft服务器网络安全解决方案-SQL注入解决
  3. 解决内存瓶颈和计算负载问题,韩松团队提出 MCUNetV2
  4. CNN 与 Transformer 的强强联合!谷歌最新开源 BoTNet,ImageNet 达 84.7%准确率
  5. boost::spirit模块实现一个类似于 XML 的小型解析器,Karma 用于打印生成的 AST
  6. D3DCOLOR与D3DXCOLOR
  7. Codeforces Round #564 (Div. 2) C. Nauuo and Cards
  8. 让nginx支持文件上传的几种模式
  9. 旋转数组(右旋转,js实现,unshift,splicec实现)
  10. 今晚博文视点大咖直播伴你读No.2:人工智能学习路线
  11. C语言pid算法模糊控制,温度PID模糊控制的算法完整
  12. VBA 根据模板批量生成工作表
  13. java如何解除文件锁定状态_Eclipse操作SVN时中断锁定,文件的解锁方法
  14. Altium Designer 18中的Data Management–Device Sheets
  15. 今日早报 每日精选12条新闻简报 每天一分钟 知晓天下事 8月13日
  16. Hive 优化(通用版)
  17. Mencoder转换视频格式(1)
  18. nginx利用ngx_http_geoip2_module模块对国外ip限制
  19. 【EMNLP 2021】SimCSE:句子嵌入的简单对比学习 【CVPR 2021】理解对比学习损失函数及温度系数
  20. 麦克风阵列声源定位解决方案

热门文章

  1. LiveVideoStack 2021招聘季
  2. 视频会议场景下的弱网优化
  3. Nginx 最全操作总结
  4. 直播预约 | 揭秘微信支付背后的数据库技术
  5. ngx_conf_s
  6. MySQL令人头疼的Aborted告警案例分析
  7. go WaitGroup的坑
  8. 企业开发中,git提交时屏蔽某些文件,怎么搞!【idea的处理方法】
  9. 你的“大厂梦”不是梦,你离大厂仅差我这篇博客!!!【吐血推荐】
  10. JavaScript 使用变量访问对象属性