倒计时12

啊,最近在上课,但我没有放弃学习,看了视频和自己以前的博客,今天做了国赛题 ,加油!
一、最大乘积
描述

把 1~9 这9个数字分成两组,中间插入乘号,
有的时候,它们的乘积也只包含1~9这9个数字,而且每个数字只出现1次。

比如:
984672351 = 345619872
987513462 = 341875962
9 * 87146325 = 784316925

符合这种规律的算式还有很多,请你计算在所有这些算式中,乘积最大是多少?

注意,需要提交的是一个整数,表示那个最大的积,不要填写任何多余的内容。
(只提交乘积,不要提交整个算式)

输入

没有输入。

输出

package day1;
//考察数列的全排列
public class t2 {
	static int max=-1;
	public static boolean jud(int i){//用于判断是否只含1-9,且仅一次
		int num[]=new int [9];
		boolean flag=true;
		while(i!=0){
			int t=i%10;
			if(t==0){
				flag=false;
				return flag;
			}else{
				num[t-1]++;
				i=i/10;
			}
		}
		
//		for(int j=0;j<9;j++){
//			System.out.print(num[j]+" ");
//		}
		for(int j=0;j<9;j++){
			if(num[j]!=1){
				flag=false;
				break;
			}
		}
		return flag;
	}
	public static void qpl(int[]num,int i){//全排列
		if(i==num.length){
//			int nu=0;
//			for(int j=0;j<num.length;j++){
//				nu+=(int) (num[j]*Math.pow(10,j));
//			}
//			if(jud(nu)){
//				System.out.println(nu);
//			}
			cf(num);
		}else{
			for(int t=i;t<num.length;t++){
				swap(num, i, t);
				qpl(num, i+1);
				swap(num, i, t);
			}
		}
	}
	public static void cf(int []num){//选择位置,进行乘法
		for(int i=1;i<=8;i++){
			int a=0,b=0;//a代表前半部分,b代表后半部分
			for(int j=0;j<i;j++){
				b+=(int) (num[j]*Math.pow(10,j));
			}
			for(int j=i;j<num.length;j++){
				a+=(int) (num[j]*Math.pow(10,j-i));
			}
			long res=a*b;
//			System.out.println(a+"*"+b+"*"+res);
			int a1=(int) (res/Math.pow(10, 9));
			int b1=(int) (res/Math.pow(10, 8));
			if(a1==0&&b1!=0){
//			if((int)res/Math.pow(10, 9)==0&&(int)res/Math.pow(10, 8)!=0){//保证是9位数
				if(jud((int)res)){
					System.out.println(a+"!"+b+"!"+res);
					if(res>max){
						max=(int) res;
					}
				}
			}
		}
	}
	public static void swap(int []num,int i,int j){
		int t=num[i];
		num[i]=num[j];
		num[j]=t;
	}
	public static void main(String[] args) {
		
		System.out.println(jud(784316925));
//		int []num={1,2,3,4,5,6,7,8,9};
		int []num={9,5,2,3,6,4,1,7,8};
		cf(num);
//		qpl(num, 0);
		int res=123456789;
		int a=(int) (res/Math.pow(10, 9));
		System.out.println(a);
//		System.out.println(max);
		
		System.out.println(839542176);
	}
	
}

二、控制台输出一个整数,表示那个最大的积,不要填写任何多余的内容。
对于某个串,比如:“1234”,求它的所有全排列`

`。
并且要求这些全排列一定要按照字母的升序排列。
对于“1234”,应该输出(一共4!=24行):
1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412
3421
4123
4132
4213
4231
4312
4321

下面是实现程序,请仔细分析程序逻辑,并填写划线部分缺少的代码。

package day1;
//轮换前k个,再递归处理
import java.util.*;
public class t3
{
	static void permu(char[] data, int cur){
		if(cur==data.length-1){
			System.out.println(new String(data));
			return;
		}
		
		for(int i=cur; i<data.length; i++){
			char tmp = data[i]; 
			for(int j=i-1; j>=cur; j--) data[j+1] = data[j];
			data[cur] = tmp;	
			
			permu(data, cur+1);
			
			tmp = data[cur]; 

//			data[cur]=data[i];
			for(int j=cur; j<i; j++) data[j] = data[j+1];
			data[i] = tmp;			
		}
	}
	
	static void permu(String x){
		permu(x.toCharArray(),0);
	}
	
	public static void main(String[] args){
		permu("12345");
	}
}

三、整理玩具
描述

小明有一套玩具,一共包含NxM个部件。这些部件摆放在一个包含NxM个小格子的玩具盒中,每个小格子中恰好摆放一个部件。

每一个部件上标记有一个0~9的整数,有可能有多个部件标记相同的整数。

小明对玩具的摆放有特殊的要求:标记相同整数的部件必须摆在一起,组成一个矩形形状。

如以下摆放是满足要求的:

00022
00033
44444

12244
12244
12233

01234
56789

以下摆放不满足要求:

11122
11122
33311

111111
122221
122221
111111

11122
11113
33333

给出一种摆放方式,请你判断是否符合小明的要求。

输入

输入包含多组数据。
第一行包含一个整数T,代表数据组数。 (1 <= T <= 10) 以下包含T组数据。
每组数据第一行包含两个整数N和M。 (1 <= N, M <= 10)
以下包含N行M列的矩阵,代表摆放方式。

输出

对于每组数据,输出YES或者NO代表是否符合小明的要求。

输入样例 1

3
3 5
00022
00033
44444
3 5
11122
11122
33311
2 5
01234
56789

package day1;

import java.util.HashSet;
import java.util.Scanner;

public class t4_2 {
	static HashSet<Integer> hs;
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int tsum;
		tsum=sc.nextInt();
		for(int ti=0;ti<tsum;ti++){
			int n=sc.nextInt();
			int m=sc.nextInt();
			int [][]num=new int[n][m];
			
			hs=new HashSet<Integer>();
			for(int i=0;i<n;i++){
				String temp=sc.next();
				char []tcs=temp.toCharArray();
				for(int j=0;j<m;j++){
					int t=Integer.parseInt(String.valueOf(tcs[j]));
					num[i][j]=t;
				}
			}
			int flag=1;
			for(int i=0;i<n;i++){
				for(int j=0;j<m;j++){
					if(num[i][j]!=-1&&!hs.contains(num[i][j])){
						int t=num[i][j];
						if(jud(num, num[i][j], i, j)){
							hs.add(t);
							continue;
						}else{
							flag=0;break;
						}
						
					}
					if(flag==0){
						break;
					}
				}
				if(flag==0){
					break;
				}
			}
			if(flag==0){
				System.out.println("NO");
			}else{
				int f2=1;
				for(int i=0;i<n;i++){
					for(int j=0;j<m;j++){
						if(num[i][j]!=-1){
							f2=0;
						}
					}
				}
				if(f2==0){
					System.out.println("NO");
				}else{
					System.out.println("YES");
				}
			}
			
		}
		
		
	}
	//判断数字i构成的是不是一个矩形
	public static boolean jud(int [][]num,int i,int x,int y){
		int endx=-1,endy=-1;
		for(int j=x;j<num.length;j++){
			if(num[j][y]==i){
				endx=j;
			}
		}
		for(int j=y;j<num[0].length;j++){
			if(num[x][j]==i){
				endy=j;
			}
		}
		boolean flag=true;
		for(int m=x;m<=endx;m++){
			for(int n=y;n<=endy;n++){
//				System.out.println(x+"@@@"+y);
//				System.out.println(m+"***"+n);
//				System.out.println(endx+"&&&"+endy);
				if(num[m][n]==i){
					num[m][n]=-1;
				}else{
					flag=false;
				}
			}
		}
//		for(int i1=0;i1<num.length;i1++){
//			for(int j=0;j<num[0].length;j++){
//				System.out.print(num[i1][j]+" ");
//			}
//			System.out.println();
//			
//		}
//		System.out.println();
		return flag;
	}
}

还有个错误的代码,但是参考意义也很大(错误是指 不符合本题)

package day1;

import java.util.HashSet;
import java.util.Scanner;

//考察连通性(连着就可以用,不适合本题,错误的答案,仅针对于实例)
public class t4 {
	static int [][]step={{-1,0},{1,0},{0,1},{0,-1}};
	static HashSet<Integer> hs;
	public static void main(String[] args) {
		int n,m;
		int sum;
		Scanner sc=new Scanner(System.in);
		sum=sc.nextInt();
		for(int tsum=0;tsum<sum;tsum++){
			hs=new HashSet<Integer>();
			n=sc.nextInt();
			m=sc.nextInt();
			int [][]num=new int[n][m];
			for(int i=0;i<n;i++){
				String temp=sc.next();
				char []tcs=temp.toCharArray();
				for(int j=0;j<m;j++){
					int t=Integer.parseInt(String.valueOf(tcs[j]));
					num[i][j]=t;
				}
			}
			
//			lt(num, 0, 0, 0);
//			for(int i=0;i<n;i++){
//				for(int j=0;j<m;j++){
//					System.out.print(num[i][j]+" ");
//				}
//				System.out.println();
//			}
			
			for(int i=0;i<n;i++){
				for(int j=0;j<m;j++){
					if(num[i][j]!=-1&&!hs.contains(num[i][j])){
						hs.add(num[i][j]);
						lt(num, num[i][j], i, j);
						
//						System.out.println(num[i][j]);
					}
				}
			}
			
			int flag=1;
			for(int i=0;i<n;i++){
				for(int j=0;j<m;j++){
//					System.out.print(num[i][j]+" ");
					if(num[i][j]!=-1){
						flag=0;
					}
				}
//				System.out.println();
			}
			if(flag==1){
				System.out.println("YES");
			}else{
				System.out.println("NO");
			}
		}
		
	}
	public static void lt(int [][]num,int i,int x,int y){//判断连通, 数组,数字
		num[x][y]=-1;
		if(x<0||x>num.length-1||y<0||y>num[0].length-1){
			return;
		}
		for(int j=0;j<4;j++){
			int tx=x+step[j][0];
			int ty=y+step[j][1];
			
			if(tx<0||tx>num.length-1||ty<0||ty>num[0].length-1){
				continue;
			}else{
				if(num[tx][ty]==i){
					num[tx][ty]=-1;
					lt(num, i, tx, ty);
				}
			}
			
			
		}
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值