数字全排列问题
问题
2,3,3,4,5,6这6个数字,用Java写一个main函数,打印出所有不同的排列
要求: '4’不能在第4位, '3’与’5’不能相连
代码
/**
* 2,3,3,4,5,6这6个数字,用Java写一个main函数,打印出所有不同的排列
* 要求: '4'不能在第4位, '3'与'5'不能相连
* @author dxt
*
*/
public class test {
public static void main(String[] args){
int[] arr = {2, 3, 3, 4, 5, 6};
permutations(arr, 0, arr.length-1);
}
/**
* 递归输出全排列
* @param arr
* @param k
* @param m
*/
public static void permutations(int arr[], int k, int m){
if(k == m){
if(arr[3] != 4){ //设定4不能在第四位
for(int i=1; i<=m; i++){ //保证3和5不相连
if((arr[i] == 3&&arr[i-1] ==5) || (arr[i] == 5&&arr[i-1]==3)){
return;
}
}
for(int i=0; i<=m; i++){
System.out.print(arr[i]);
}
System.out.println();
}
}else{
for(int i=k; i<=m; i++){
//swap()
int temp = arr[k];
arr[k] = arr[i];
arr[i] = temp;
permutations(arr, k+1, m);
temp = arr[k];
arr[k] = arr[i];
arr[i] = temp;
}
}
}
}
补给点问题
问题
有n行m列表格,每个格子表示一个军营,现在要给军营空投补给,如果补给落在格子内,则只能表示给此格子代表的军营投补给,如果落在两个格子的边界,则表示给这两个格子表示的军营投补给,如果落在顶点上,则表示给所有以此顶点为顶点的格子表示的军营投补给。问如何投补给才能保证投放的补给个数最少,请给出最少个数。
分析
显然一个补给最多供应4个格子(落在4个格子的公共顶点上),然后是一个补给可以供应2个格子,最后是一个补给供应一个格子。
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args){
//接收数据
int n, m;
Scanner in = new Scanner(System.in);
n = in.nextInt();
m = in.nextInt();
in.close();
//计算最小补给数
int minNum = 0;
int d_row = 0; //成对的行数
int d_col = 0; //成对的列数
int num_row = 0; //剩余行所需补给个数
int num_col = 0; //剩余列所需补给个数
boolean flag_row = false; //是否有剩余行
boolean flag_col = false; //是否有剩余列
//当格子数量很少时:当0<n, m <=1或n,m其中之一为2时
if((n == 1 && (m == 1 || m == 2)) || (m==1 && (n==1 || n==2))){
minNum = 1;
}else{
if((n%2) == 1){ //处理行数据
d_row = n-1;
num_row = n/2;
flag_row = true;
}else{
d_row = n;
}
if((m%2) == 1){ //处理列
d_col = m-1;
num_col = m/2;
flag_col = true;
}else{
d_col = m;
}
minNum = ((d_row*d_col) / 4) + num_row + num_col;
//在计算num_row和num_col时,除法会用去尾法得到结果,但最后还应在加一
if(flag_row || flag_col){
minNum++;
}
}
//输出结果
System.out.println(minNum);
}
}