java算法编程题_【java题目】考验你编程能力和算法的时候到了
該樓層疑似違規已被系統折疊?隱藏此樓查看此樓
這是我寫的,但是算法很復雜,唉,求高手啊
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题目】考验你编程能力和算法的时候到了的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java的基础语法是什么_java语法基
- 下一篇: java自定义对话框_Flutter A