1.1 数字全排列和补给点问题

数字全排列问题

问题

      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);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值