三个算法题
作者:互联网
题目
小明今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子.....小明不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5张牌就可以变成“1,2,3,4,5”(大小王分别看作2和4),“So Lucky!”。小明决定去买体育彩票啦。 现在,要求你使用这幅牌模拟上面的过程,然后告诉我们小明的运气如何, 如果牌能组成顺子就输出true,否则就输出false。为了方便起见,你可以认为大小王是0。
翻译:输入5个数,判断是否是顺子,0可以当任何数。
思路
思路一:
顺子要素:除了0没有重复数字+(最大值-最小值<5)
思路二:
顺子要素:除了0没有重复数字+(排序后间隔数<0的个数)
package work;
import java.util.Arrays;
import java.util.Scanner;
/**
* DELL
* 2021/1/16
* 14:01
*输入5个数,判断是否是顺子,0可以当任何数。
* 思路
* 思路一:
* 顺子要素:除了0没有重复数字+(最大值-最小值<5)
* 思路二:
* 顺子要素:除了0没有重复数字+(排序后间隔数<0的个数)
*/
public class OtherMethon1 {
public static void main(String[] arg){
Scanner sc = new Scanner(System.in);
int[] numbers = new int[5];
for (int i = 0; i < 5; i++) {
System.out.print("请输入第" + (i + 1) + "个数");
numbers[i] = sc.nextInt();
}
System.out.print(getResult1(numbers));
System.out.print(getResult2(numbers));
}
static boolean getResult1(int[] numbers){
//最大值减去最小值小于五
int max = 0,min = 14;
for(int i =0;i<5;i++){
if(numbers[i] != 0){
max = max > numbers[i] ? max : numbers[i];
min = min < numbers[i] ? min : numbers[i];
}
if(max - min < 5)return true;
}
return false;
}
static boolean getResult2(int[] numbers){
Arrays.sort(numbers);
for (int i = 1; i < 5; i++) {
if(numbers[i] - numbers[i-1] > 1)return false;
}
return true;
}
}
题目
每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!^_^)。请你试着想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)
思路
思路一:用数组模拟
思路二:用循环链表
package work;
import java.util.Arrays;
import java.util.Scanner;
import java.util.Random;
/**
* DELL
* 2021/1/16
* 14:37
*每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,
* 今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。
* 其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,
* 他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1
* 的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,
* 并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数..
* ..这样下去....直到剩下最后一个小朋友,可以不用表演,并且拿
* 到牛客名贵的“名侦探柯南”典藏版(名额有限哦!!^_^)。请你试着
* 想下,哪个小朋友会得到这份礼品呢?(注:小朋友的编号是从0到n-1)
思路
思路一:用数组模拟
思路二:用循环链表
*
*/
public class OtherMethon2 {
public static void main(String[] args) {
//输入游戏人数
Scanner sc = new Scanner(System.in);
int sum = sc.nextInt();
//新建数组存放人的编号
int[] member = new int[sum];
for (int i = 0; i < sum; i++) {
member[i] = (i + 1);
}
// m表示的是随机抽出的数,temp表示上一次随机抽出的数
int m,temp;
while(member.length > 1){
Random r = new Random();
m = r.nextInt(member.length);
temp = 0;
//如果从上一次的位置到数组的结尾一共包含的人数小于随机数,则执行以下语句
if((member.length - temp - 1) > m){
for(int i = m; i < member.length;i++){
if (i > 0) {
member[i - 1] = member[i];
};
}
// 将这次的随机数放入temp中
temp = m;
//以下情况是:随机数m超出从上一次的位置到数组的结尾一共包含的人数
}else{
//得到去除上一次的位置到数组的结尾一共包含的人数,得到新的m
m = m - (member.length - temp);
//将m位置移到m-1的位置,以此类推
for(int i = m; i < member.length ;i++){
if(i > 0) {
member[i - 1] = member[i];
}else{
break;
}
}
//得到这一次的随机数m
temp = m;
}
//数组的缩减
member = Arrays.copyOf(member,member.length - 1);
}
//输出最后的一位同学
System.out.print(member[0]);
}
}
项目描述: * 共计21张牌。在{村民,狼人,守护,预言家,猎人,丘比特,长老,盗贼,替罪羊,女巫}随机生成12-18个身份 * (每个身份唯一,村民狼人除外)。有三张底牌,底牌必须不能出现盗贼身份。 * 玩家输入游戏人数:15 * 随机生成游戏人数配置: * 游戏配置:12-18人(大于18人或者小于12人,输出超出游戏人数范围) * 标准配置: * 人数(狼,民,神) * 18(5,7,5)人 5狼人 7村民 1预言家 1女巫 1丘比特 1守护 1猎人 1村长 1 替罪羊 1吹笛者 1盗贼 21张牌 * 17(5,6,6)人 5狼人 7村民 1预言家 1女巫 1丘比特 1守护 1猎人 1村长 1 替罪羊 1盗贼 20张牌 * 16(5,6,5)人 5狼人 6村民 1预言家 1女巫 1丘比特 1守护 1猎人 1村长 1 替罪羊 1盗贼 19张牌 * 15(5,5,5)人 5狼人 5村民 1预言家 1女巫 1丘比特 1守护 1猎人 1村长 1 替罪羊 1盗贼 18张牌 * 14(4,5,5)人 4狼人 5村民 1预言家 1女巫 1丘比特 1守护 1猎人 1村长 1 替罪羊1 盗贼 17张牌 * 13(4,5,4)人 4狼人 5村民 1预言家 1女巫 1丘比特 1守护 1猎人 1村长 1 盗贼 16张牌 * 12(4,4,4)人 4狼人 4村民 1预言家 1女巫 1丘比特 1守护 1猎人 1村长 1 盗贼 15张牌 * * 盗贼是一个特殊身份:当某位玩家获得盗贼牌的时候,可以翻开底牌三张选择底牌中自己想要的身份(有狼人要选狼人) * 要求: * 1.底牌可以没有狼人,如果有,最多只能有一个狼人; * 2.底牌不能有盗贼; * 3.输出如下: * 玩家手牌为: * {01:村民,02:丘比特,03:盗贼,... ,15:女巫} * 盗贼底牌为: * {01:XX,02:XX ,03:XX}
package work;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
/**
* DELL
* 2021/1/15
* 16:46
* 项目描述:
* 共计21张牌。在{村民,狼人,守护,预言家,猎人,丘比特,长老,盗贼,替罪羊,女巫}随机生成12-18个身份
* (每个身份唯一,村民狼人除外)。有三张底牌,底牌必须不能出现盗贼身份。
* 玩家输入游戏人数:15
* 随机生成游戏人数配置:
* 游戏配置:12-18人(大于18人或者小于12人,输出超出游戏人数范围)
* 标准配置:
* 人数(狼,民,神)
* 18(5,7,5)人 5狼人 7村民 1预言家 1女巫 1丘比特 1守护 1猎人 1村长 1 替罪羊 1吹笛者 1盗贼 21张牌
* 17(5,6,6)人 5狼人 7村民 1预言家 1女巫 1丘比特 1守护 1猎人 1村长 1 替罪羊 1盗贼 20张牌
* 16(5,6,5)人 5狼人 6村民 1预言家 1女巫 1丘比特 1守护 1猎人 1村长 1 替罪羊 1盗贼 19张牌
* 15(5,5,5)人 5狼人 5村民 1预言家 1女巫 1丘比特 1守护 1猎人 1村长 1 替罪羊 1盗贼 18张牌
* 14(4,5,5)人 4狼人 5村民 1预言家 1女巫 1丘比特 1守护 1猎人 1村长 1 替罪羊1 盗贼 17张牌
* 13(4,5,4)人 4狼人 5村民 1预言家 1女巫 1丘比特 1守护 1猎人 1村长 1 盗贼 16张牌
* 12(4,4,4)人 4狼人 4村民 1预言家 1女巫 1丘比特 1守护 1猎人 1村长 1 盗贼 15张牌
*
* 盗贼是一个特殊身份:当某位玩家获得盗贼牌的时候,可以翻开底牌三张选择底牌中自己想要的身份(有狼人要选狼人)
* 要求:
* 1.底牌可以没有狼人,如果有,最多只能有一个狼人;
* 2.底牌不能有盗贼;
* 3.输出如下:
* 玩家手牌为:
* {01:村民,02:丘比特,03:盗贼,... ,15:女巫}
* 盗贼底牌为:
* {01:XX,02:XX ,03:XX}
*/
public class Werewolf {
public static void main(String[] args) {
// 初始化变量
Scanner sc = new Scanner(System.in);
int peopleSum ;
//输入合法游戏人数
for(;;){
System.out.println("请输入游戏人数 :");
peopleSum = sc.nextInt();
if(peopleSum >= 12 && peopleSum <= 18){
break;
}else{
System.out.println("大于18人或者小于12人,输出超出游戏人数范围");
}
}
// 获得标准配置
String[] standardConfiguration = getStandardConfiguration(peopleSum);
//输出格式调整
for (int i = 0,j=1; i <standardConfiguration.length ; i++) {
// if(i < peopleSum)System.out.print("玩家" + (i + 1) + ":");
// else{System.out.print("盗贼底牌" + j++ + ":");}
if(i == 0)System.out.print("玩家手牌为:" + '\n' + '\t');
System.out.print((i <peopleSum ? ((Math.round(i)*10)/10 + 1) : j++));
System.out.print(standardConfiguration[i]);
if(i % 5 ==0 && i != 0 )System.out.print('\n');
System.out.print('\t');
if(i == peopleSum -1)System.out.print('\n' + "盗贼底牌为:" + '\n');
}
}
//获得标准配置数组的算法
public static String[] getStandardConfiguration(int peopleSum){
;
switch (peopleSum){
case 18: {
String[] cards= {"狼人1","狼人2","狼人3","狼人4","狼人5","村民1","村民2","村民3","村民4","村民5",
"村民6","村民7","预言家1","女巫1","丘比特1","守护1","猎人1","村长1","替罪羊","吹笛者"};
return getLastConfiguration(cards,peopleSum);
}
case 17: {
String[] cards= {"狼人1","狼人2","狼人3","狼人4","狼人5","村民1","村民2","村民3","村民4","村民5",
"村民6","村民7","预言家1","女巫1","丘比特1","守护1","猎人1","村长1","替罪羊"};
return getLastConfiguration(cards,peopleSum);
}
case 16: {
String[] cards= {"狼人1","狼人2","狼人3","狼人4","狼人5","村民1","村民2","村民3","村民4","村民5",
"村民6","预言家1","女巫1","丘比特1","守护1","猎人1","村长1","替罪羊"};
return getLastConfiguration(cards,peopleSum);
}
case 15: {
String[] cards= {"狼人1","狼人2","狼人3","狼人4","狼人5","村民1","村民2","村民3","村民4","村民5",
"预言家1","女巫1","丘比特1","守护1","猎人1","村长1","替罪羊"};
return getLastConfiguration(cards,peopleSum);
}
case 14: {
String[] cards= {"狼人1","狼人2","狼人3","狼人4","村民1","村民2","村民3","村民4","村民5","预言家1",
"女巫1","丘比特1","守护1","猎人1","村长1","替罪羊"};
return getLastConfiguration(cards,peopleSum);
}
case 13: {
String[] cards= {"狼人1","狼人2","狼人3","狼人4","村民1","村民2","村民3","村民4","村民5","预言家1",
"女巫1","丘比特1","守护1","猎人1","村长1"};
return getLastConfiguration(cards,peopleSum);
}
case 12: {
// 一共15张牌,暂时去掉盗贼14张牌
String[] cards = {"狼人1","狼人2","狼人3","狼人4","村民1","村民2","村民3","村民4","预言家1","女巫1",
"丘比特1","守护1","猎人1","村长1"};
return getLastConfiguration(cards,peopleSum);
}
//不存在的情况
default:;
}
String a[] = new String[1];
return a;
}
//检查生成的标准配置的底牌是否符合狼人数量小于等于1
public static boolean lastThreeCheck(int peopleSum, String[] cards) {
int temp = 0;
for(int i = cards.length-1;i>(cards.length - 4);i--){
if(cards[i] == "狼人1" || cards[i] == "狼人2"|| cards[i] == "狼人3"|| cards[i] == "狼人4"|| cards[i] == "狼人5")temp++;
}
if(temp <= 1)return true;
else{
return false;
}
}
//算法复用,使用当前算法可以得到最后的标准配置数组
public static String[] getLastConfiguration(String cards[],int peopleSum){
Random r =new Random();
//得到一个除了盗贼,其他角色都包括的数组,
for (int i =0;;i++) {
//获得一个0~13随机数
int rd = r.nextInt(peopleSum+2);
String temp = cards[rd];
cards[rd] = cards[0];
cards[0] = temp;
if(i > (peopleSum + 2) *10){
if(lastThreeCheck(peopleSum, cards)){
break;
}
}
}
String[] lastThreeCharacter = new String[3];
System.arraycopy(cards,peopleSum-1,lastThreeCharacter,0,3);
cards = Arrays.copyOf(cards,peopleSum);
cards[peopleSum-1] = "盗贼";
//除去底牌的数组随机
for (int i =0;i<(peopleSum) * 10;i++) {
//获得一个0~10随机数
int rd = r.nextInt(peopleSum);
String temp = cards[rd];
cards[rd] = cards[0];
cards[0] = temp;
}
cards = Arrays.copyOf(cards,peopleSum + 3);
for(int i = cards.length-1,j=0;i>(cards.length - 4);i--,j++){
cards[i] = lastThreeCharacter[j];
}
return cards;
}
}
来自为知笔记(Wiz)
标签:member,狼人,丘比特,女巫,算法,三个,张牌,盗贼 来源: https://www.cnblogs.com/jessezs/p/79d4445afa1ec9ad87358883f26120cc.html