本文主要是【穷举模拟】——蓝桥杯练习题-穷举模拟的文章,如果有什么需要改进的地方还请大佬指出??
🎬作者简介:大家好,我是听风与他🥇
??博客首页:CSDN主页听风与他
🌄每日一句:狠狠沉淀,顶峰相见
题目描述:已知A、B、C、D中有一个凶手,对他们审讯,已知三个人说真话,一个人说假话。谁是凶手
A说不是我
B说是C
C说是D
D说C在胡说
请你找出凶手
package 穷举模拟;
public class Killer {
public static void main(String[] args) {
// TODO Auto-generated method stub
int count = 0;//统计有几个人说的是真话
for(int killer='A';killer<='D';killer++) {
count = 0;
if(killer!='A') count++;
if(killer=='C') count++;
if(killer=='D') count++;
if(killer!='D') count++;
if (count==3) {
System.out.println((char)killer);
}
}
}
}
题目描述:
求需要多少次分配,才能使游戏结束
package 穷举模拟;
import java.util.Arrays;
public class test1 {
/*
分发糖果
每个小孩若干个,不相等
每个小孩将自己糖果一半给右边小孩
如果有人奇数,补给一个
所有小孩都相等,游戏结束
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int a[] = {10,2,8,22,16,4,10,6,14,20};
int count=0;
while(isGameOver(a)==false) {
count++;
fenpei(a);//先分配
System.out.println(Arrays.toString(a));
supply(a);//后补给
}
System.out.println(count+1);
}
public static void fenpei(int a[]) {
int n = a.length;
int half = a[n-1]/2;
a[n-1]/=2;
for(int i=n-1;i>=1;i--) {
a[i]=a[i]+a[i-1]/2;//右边的等于左边的给自己一半
a[i-1]=a[i-1]/2;//左边的人只剩下一半
}
a[0]=a[0]+half;
}
public static void supply(int a[]) {
for(int i=0;i<a.length;i++) {
if(a[i]%2==1) {
a[i]++;//奇数补给一个
}
}
}
public static boolean isGameOver(int a[]) {
for(int i=1;i<a.length;i++) {
if(a[i]!=a[0]) {
return false;
}
}
return true;
}
}
写法二:
int a[] = {10,2,8,22,16,4,10,6,14,20};
int n = a.length;
int count = 0;
while(true) {
boolean flag = true;
int half = a[n-1]/2;
a[n-1]/=2;
for(int i=n-1;i>=1;i--) {
a[i]+=a[i-1]/2;
a[i-1]/=2;
}
a[0]+=half;
System.out.println(Arrays.toString(a));
for(int i=0;i<n;i++) {
if(a[i]%2==1) a[i]++;
}
for(int i=1;i<n;i++) {
if(a[i]!=a[0]) flag=false;
}
count=count+1;
if (flag) {
System.out.println("count:"+count+1);
break;
}
}