经典田忌赛马算法JAVA解决代码

来源:互联网 发布:c语言计算最大公约数 编辑:程序博客网 时间:2024/05/19 05:02
题记:现在很多经典的故事都被变成程序员的考试题,前几天女朋友面试题就碰到了,后来跟我说了,自己也做了下,那么下面就先来温习下这个故事^.^;
田忌赛马出自《史记》卷六十五:《孙子吴起列传第五》,故事的主角是田忌、孙膑和齐威王,是中国历史上有名的揭示如何善用自己的长处去对付对手的短处,从而在竞技中获胜的事例。
齐国使者到大梁来,孙膑以刑徒的身份秘密拜见,劝说齐国使者。齐国使者觉得此人是个奇人,就偷偷地把他载回齐国。齐国将军田忌非常赏识他,并且待如上宾。田忌经常与齐国众公子赛马,设重金赌注。孙膑发现他们的马脚力都差不多,马分为上、中、下三等,于是对田忌说:“您只管下大赌注,我能让您取胜。”田忌相信并答应了他,与齐王和各位公子用千金来赌注。比赛即将开始,孙膑说:“现在用您的下等马对付他们的上等马,用您的上等马对付他们的中等马,用您的中等马对付他们的下等马。”已经比了三场比赛,田忌一场败而两场胜,最终赢得齐王的千金赌注。于是田忌把孙膑推荐给齐威王。齐威王向他请教了兵法,于是把他当成老师。
正文:
要求:输入两行数字,中间用空格分开,第一行代表田忌的马,第二行代表齐王的马,数字的大小代表马跑的速度,数字越大跑的越快,当两个数字相同时田忌不算赢,要求输出田忌最多能赢多少场
例 : 输入:6 4 3 1
8 5 4 2 
输出:2
分析:这里的输入的是字符串,涉及到字符串转int型的数据类型转换,还要求按照其原理进行排兵布阵
代码:


import java.util.Scanner;

import java.util.List;

import java.util.ArrayList;

import java.util.Collections;

/**

 * 田忌赛马算法

 * @authorszp

 *

 */

public class Tjsm {

    public static void main(Stringargs[]){

      

        List<Integer>  xiaotiantian=new ArrayList<Integer>();

        List<Integer>  xiaoqiqi=new ArrayList<Integer>();

        

        Scanner sc = new Scanner(System.in);

System.out.println("请输入一串数字数组,并用空格分隔(田忌的马):");

String a = sc.nextLine();

String[] arr1 = a.split(" ");

  for (inti = 0; i < arr1.length;i++) {

  xiaotiantian.add(Integer.parseInt(arr1[i]));

}

  System.out.println("请输入一串数字数组,并用空格分隔(齐王的马):");

String b = sc.nextLine();

String[] arr2 = b.split(" ");

  for (inti = 0; i < arr1.length;i++) {

  xiaoqiqi.add(Integer.parseInt(arr2[i]));

}

  intn = xiaotiantian.size();

  booleanbLast=true;

        while(bLast){

            if(n==0) {

            break;

            }

            //处理数据  

            Collections.sort(xiaotiantian);

            Collections.sort(xiaoqiqi);

            inti=0, j=0, x=n-1,y=n-1,cnt=0;

           

            while(bLast) {

                //是否是最后一匹马  

                if(x==i){

                    bLast=false;

                }

                if(xiaotiantian.get(x) >xiaoqiqi.get(y)) {//如果田忌当前最好的马可以胜齐王最好的马,那么比一场 

                    x--;

                    y--;

                    cnt++;

                }

                elseif(xiaotiantian.get(i)>xiaoqiqi.get(j)){//如果田忌当前最差的马可以胜齐王最差的马,那么比一场 

                    i++;

                    j++;

                    cnt ++;

                }

                else if(xiaotiantian.get(i) <xiaoqiqi.get(y))  {//否则,让田忌最差的马和齐王最好的好比一场 

                    i++;

                    y--;

                }

            }

            System.out.println("田忌可以赢得的比赛场次是:"+cnt);

            xiaotiantian.clear();

            xiaoqiqi.clear();

        }

    }

}


原创粉丝点击