蓝桥刷题记录(续)

一、《玩具蛇》

问题描述

在这里插入图片描述

算法分析

本题采用的是dfs的思想,基本思路就是遍历每个方格,对每个格子使用dfs进行搜索,若蛇长度为0,则为dfs出口,蛇行方法加一。

代码如下

package dfs;

public class 玩具蛇 {
	static int count = 0;
	static boolean visited[][];
	
	public static void main(String[] args) {
		for(int i=0;i<4;i++) {
			for(int j=0;j<4;j++) {
				visited = new boolean[4][4];
				visited[i][j] = true;
				dfs(i,j,15);
				visited[i][j] = false;
			}
		}
		System.out.println(count);
	}
	public static void dfs(int x,int y,int length) {
		//判断是否没长度了
		if(length == 0) {
			//这是一种蛇行方法
			count++;
			return;
		}
		//向上
		if(x-1>=0&&!visited[x-1][y]) {
			visited[x-1][y] = true;
			dfs(x-1, y, length-1);
			visited[x-1][y] = false;
		}
		//向下
		if(x+1<=3&&!visited[x+1][y]) {
			visited[x+1][y] = true;
			dfs(x+1, y, length-1);
			//为了回退继续深度搜索
			visited[x+1][y] = false;
		}
		//向左
		if(y-1>=0&&!visited[x][y-1]) {
			visited[x][y-1] = true;
			dfs(x, y-1, length-1);
			visited[x][y-1] = false;
		}
		//向右
		if(y+1<=3&&!visited[x][y+1]) {
			visited[x][y+1] = true;
			dfs(x, y+1, length-1);
			visited[x][y+1] = false;
		}
		return;
	}
}


二、《小朋友崇拜圈》

问题描述

在这里插入图片描述

算法分析

同理,使用dfs搜索。

代码如下

package dfs;

import java.util.Arrays;
import java.util.Scanner;

public class 小朋友崇拜圈 {
	static int x;
	static boolean[] bs;
	static int max;	
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		int[] arr = new int[n];
		for(int i=0;i<n;i++){
			arr[i] = scanner.nextInt();
		}
		bs = new boolean[n];
		for(int i=0;i<n;i++){
			//记录开头的小朋友
			x=i;
			dfs(arr, arr[i]-1, 0);
			Arrays.fill(bs, false);
		}
		//输出最大圈的人数
		System.out.println(max+1);
	}
	static void dfs(int[]a,int i,int k) {
		if (i == x) {
			max = Math.max(max, k);
		}
		if(!bs[i]) {
			bs[i] = true;
			dfs(a, a[i]-1, k+1);
		}else {
			return;
		}
	}
}

三、《N皇后问题》

问题描述

在 N×N 的方格棋盘放置了 N 个皇后,使得它们不相互攻击(即任意 2 个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成 45 角的斜线上。你的任务是,对于给定的 N,求出有多少种合法的放置方法。

输入描述:输入中有一个正整数 N≤10,表示棋盘和皇后的数量。
输出描述:为一个正整数,表示对应输入行的皇后的不同放置数量。

输入:5
输出:8

算法分析

使用dfs进行深度搜索,并添加一个验证函数,用来判断当前位置能否放置皇后。

代码如下

package dfs;

import java.util.Scanner;

public class N皇后 {
	static int res = 0;
	static int n;
	//记录访问(放置皇后)情况,每一步相当于一行(例如n=8占用0-7行)
	static int[][] board = new int[20][20];
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		n = scanner.nextInt();
		dfs(0);
		System.out.println(res);
	}
	public static void dfs(int step) {
		//如果步数等于n皇后数量,则刚好放置完所有皇后
		//例如n为8:0-7步都能放置,到了8则结束
		if(step == n) {
			res++;
			return;
		}
		//这里可以理解为:每一步在board记录中相当于一行
		for(int i=0;i<n;i++) {
			if(isValid(step, i)){
				board[step][i]++;
				dfs(step+1);
				board[step][i]--;
			}
		}
	}
	public static boolean isValid(int row,int col) {
		//检查列是否有皇后冲突
		for(int i=0;i<n;i++) {
			if(board[i][col]>0) {
				return false;
			}
		}
		//检查左上方是否有皇后冲突
		for(int i=row-1,j=col-1;i>=0&&j>=0;i--,j--) {
			if(board[i][j]>0) {
				return false;
			}
		}
		//检查右上方是否有皇后冲突
		for(int i=row-1,j=col+1;i>=0&&j<n;i--,j++) {
			if(board[i][j]>0) {
				return false;
			}
		}
		return true;
	}
}


四、《排列序数》

问题描述

如果用 a b c d 这 4 个字母组成一个串,有 4!=24 种,如果把它们排个序,每个串都对应一个序号:
abcd 0
abdc 1
acbd 2
acdb 3
adbc 4
adcb 5
bacd 6
badc 7
bcad 8
bcda 9
bdac 10
bdca 11
cabd 12
cadb 13
cbad 14
cbda 15
cdab 16
cdba 17
在这里插入图片描述

算法分析

本题算法较为简单,找出上述排列的规律公式,即可解决。

代码如下

package lanqiao;

import java.util.Scanner;

public class PermutationOrdinal1111 {
	static int jie(int x) {
		int sum=1;
		for(int i=1;i<=x;i++) {
			sum*=i;
		}
		return sum;
	}
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		String aString = scanner.nextLine();
		int sum = 0;
		int n = aString.length();
		int[][]arr = new int[n][2];
		for(int i=0;i<n;i++) {
			arr[i][0]=aString.charAt(i)-97;
			//记录比它靠前的字母用了几个
			arr[i][1]=0;
			for(int j=0;j<i;j++) {
				if(arr[j][0]<arr[i][0]) {
					arr[i][1]++;
				}
			}
		}
		for(int i=0;i<n;i++) {
			sum+=(arr[i][0]-arr[i][1])*jie(n-i-1);
		}
		System.out.println(sum);
	}
}

五、《刷题统计》

问题描述

在这里插入图片描述

算法分析

本题为简单的枚举题,需要注意的是,评测用例为超过整形等基本数据类型范围的“大数”,因此我们要使用Long类型创建对象来保存“大数”。

代码如下

package yati;

import java.math.BigInteger;
import java.util.Scanner;

public class 刷题统计枚举 {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		Long aLong = scanner.nextLong();
		Long bLong = scanner.nextLong();
		Long nLong = scanner.nextLong();
		Long[]arr = {aLong,aLong,aLong,aLong,aLong,bLong,bLong};
		Long res = new Long(0);
		int day = 0;
		int i=0;
		while(res.longValue()<nLong.longValue()) {
			res+=arr[i%7];
			i++;
			day++;
		}
		System.out.println(day);
	}
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值