这应该有很多种算法把。。如果不考虑效率的话穷举法是肯定可以的。。。也就是说试过所有的排列组合。。然后计算每次排列的剩余防御卡的价值和。。和最大的排列就是你要的匹配。。当然这个算法 当N很大的时候非常没效率。。但你的问题只要给出算法然后说明正确性。。所以穷举是肯定可行的。。
下面是模拟代码
import javautilArrayList;
public class Test {
//攻击卡数组
private int [] a = {1,1,3,4};
//匹配结果
private ArrayList<int []> result = new ArrayList<int []>();
//防御卡数组
private D [] d = {new D(1,5),new D(2,2),new D(2,8),new D(3,4)};
//最大防御卡价值初始化为0
private int value = 0;
public static void main(String []args){
int [] input = {1,2,3,4};
Test t = new Test();
tprocess(input, inputlength, 0);
ArrayList<int []> r = tgetResult();
int size = rsize();
Systemoutprintln("可能的组合有"+size+"种 ");
for(int i=0;i<size;i++){
int resultSize = rget(i)length;
Systemoutprint("第"+(i+1)+"种 为:");
for(int j=0;j<resultSize;j++){
Systemoutprint(rget(i)[j]);
}
}
Systemoutprintln();
Systemoutprintln("Value = "+tgetValue());
Systemoutprintln("结束");
}
public void process(int[] input, int n, int k) {
if (n == k) {
int count = 0;
int size = inputlength;
int [] out = new int [size];
for (int i = 0; i < size; i++) {
if(d[input[i]-1]getX()>a[i]){
count += d[input[i]-1]getY();
}
out [i] = input[i];
}
//如果排列价值和大于之前的最大防御价值改变最优匹配
if(count > value){
if(resultsize() != 0){
resultclear();
}
resultadd(out);
value = count;
for(int in:out){
Systemoutprint(in);
}
Systemoutprintln();
}
//如果价值和一样并且没有这个组合增加到结果list
if(count == value && !thisinTheResult(input)){
resultadd(out);
for(int in:out){
Systemoutprint(in);
}
Systemoutprintln();
}
} else {
for (int i = k; i < n; i++) {
swap(input, k, i);
process(input, n, k + 1);
swap(input, i, k);
}
}
}
public boolean inTheResult(int[]a){
int size = thisresultsize();
for(int i=0;i<size;i++){
int s = thisresultget(i)length;
for(int j=0;j<s;j++){
if(a[j] != thisresultget(i)[j]){
return false;
}
}
}
return true;
}
public ArrayList<int[]> getResult(){
return thisresult;
}
public int getValue(){
return thisvalue;
}
public void swap(int[] a, int x, int y) {
int temp = a[x];
a[x] = a[y];
a[y] = temp;
}
//防御卡的类 x是di y是wi
public class D{
// x = di y = wi
private int x,y;
D (int x,int y){
thisx = x;
thisy = y;
}
public int getX(){
return x;
}
public int getY(){
return y;
}
}
}
运行结果
1234
1243
1324
1342
2314
2341
3214
3241
3412
3421
4321
4312
可能的组合有4种
第1种 为:3412第2种 为:3421第3种 为:4321第4种 为:4312
Value = 12
结束
貌似测试了下应该是正确的
其实这个问题挺有意思的建议你不要看我的代码根据我的提示自己做次
import javautil;
import javaio;
public class CaiShu{
public static void main(String[] args) throws IOException{
Random a=new Random();
int num=anextInt(100);
Systemoutprintln("请输入一个100以内的整数:");
for (int i=0;i<=9;i++){
BufferedReader bf=new BufferedReader(new InputStreamReader(Systemin));
String str=bfreadLine();
int shu=IntegerparseInt(str);
if (shu>num)
Systemoutprintln("输入的数大了,输小点的!");
else if (shu<num)
Systemoutprintln("输入的数小了,输大点的!");
else {
Systemoutprintln("恭喜你,猜对了!");
if (i<=2)
Systemoutprintln("你真是个天才!");
else if (i<=6)
Systemoutprintln("还将就,你过关了!");
else if (i<=8)
Systemoutprintln("但是你还……真笨!");
else
Systemoutprintln("你和猪没有两样了!"); break;}
}
} }
以上就是关于JAVA小游戏的线程简单代码 (两个武士A、B对打)全部的内容,包括:JAVA小游戏的线程简单代码 (两个武士A、B对打)、JAVA小游戏程序代码、用JAVA编一个小游戏或者其他程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)