谁将会参加比赛的问题(java版)

题目:

A、B、C、D、E、F、G、H、I、J十名同学有可能参加本次竞赛,也有可能不参加。因为某种原因,他们是否可以
  参加本次竞赛受到以下条件的限制:
  1、如果A参加,B也参加;
  2、如果C不参加,D也不参加;
  3、A和C中只能有一人可以参加;
  4、B和D有且只有一个人可以参加;
  5、D、E、F、G、H五个人中至少有两个人参加;
  6、C和G或者都参加,或者都不参加;
  7、C、E、G、I中至多只能有两人参加;
  8、如果E参加,那么F和G也都参加;
  9、如果F参加,G和H就不能参加;
 10、如果I和J都不参加,那么H必须参加。
 请编程实现判断这些同学那些会参加本次竞赛,如果有多种可能,则输出所有可能情况,每一种情况占一行。
 参加的同学字母按升序排列,之间用空格隔开。

以下方法是本人参照蓝桥杯首页(http://www.lanqiao.org//index.action)中的视频资料中老师讲解的往届的学生做的一个比较优秀的程序而写的,仅供参考。

package java课程;


public class Who_will_join
{
    public static void main(String [] args)
    {
        int [] nums = {0,0,0,0,0,0,0,0,0,0};//为0就表示对应的学生不参加,为1就表示对应的学生参加
        Fun(nums,0);
    }
    public static boolean Judge(int[] nums)
    {
        boolean  j1 = (nums[0]==0)||(nums[1]==1);//如果A参加B就参加,这句话相当于要么A不参加,要么B参加
        boolean  j2 = (nums[2]==1)||(nums[3]==0);
        boolean  j3 = nums[0] + nums[2]<=1;
        boolean  j4 = nums[1] + nums[3]==1;
        boolean  j5 = nums[3] + nums[4] + nums[5] + nums[6] + nums[7]>=2;
        boolean  j6 = (nums[2] + nums[6]==0)||(nums[2] + nums[6]==2);
        boolean  j7 = nums[2] + nums[4] + nums[6] + nums[8]<=2;
        boolean  j8 = (nums[4]==0)||(nums[5] + nums[6]==2);
        boolean  j9 = (nums[5]==0)||(nums[6] + nums[7]==0);
        boolean j10 = (nums[8] + nums[9]>=1)||(nums[7]==1);
        return j1&&j2&&j3&&j4&&j5&j6&&j7&&j8&&j9&&j10;
    }
    public static void Fun(int[] nums,int n)
    {
        if(n>=10)
        {
            if(Judge(nums))
                Show(nums);
            return;
        }
        nums[n] = 0;
        Fun(nums,n+1);
        nums[n] = 1;
        Fun(nums,n+1);
    }
    public static void Show(int [] nums)
    {
        for(int i = 0;i<nums.length;i++)
        {
            if(nums[i]==1)
            {
                System.out.print(" "+(char)(i+'A'));
            }
        }
        System.out.println();
    }
}

运行结果截图:

谁将会参加比赛的问题(java版) - 水到绝境是飞瀑 - 潜水的小企鹅
 
通过这个视频和深入理解这个程序,我发现以前学的离散数学真的很有用,可惜以前没怎么认真学好啊,需要补习一下了。要学好编程果然数学和逻辑学必须好啊!

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值