编一个程序,从三个红球,五个白球,六个黑球中任意取出八个球,且其中必须有白球,输出所有可能的方案

qq_32529103 2015-11-19 05:43:40
刚接触c# 求教下面问题如何编程
编一个程序,从三个红球,五个白球,六个黑球中任意取出八个球,且其中必须有白球,输出所有可能的方案。
...全文
7165 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Benny_ 2015-11-27
  • 打赏
  • 举报
回复
static void Main(string[] args)
        {
            int red = 3;
            int write = 5;
            int black = 6;

            for (int i = 1; i <= write; i++)
            {
                for (int j = 0; j <= red; j++)
                {
                    black = 8 - i - j;
                    if (black != 7)//黑球数只有6个
                    {
                        Console.WriteLine("write:{0}" + " red:{1}" + " black:{2}", i, j, black);
                    }

                }
            }
            Console.ReadKey();

        }

write:1 red:1 black:6
write:1 red:2 black:5
write:1 red:3 black:4
write:2 red:0 black:6
write:2 red:1 black:5
write:2 red:2 black:4
write:2 red:3 black:3
write:3 red:0 black:5
write:3 red:1 black:4
write:3 red:2 black:3
write:3 red:3 black:2
write:4 red:0 black:4
write:4 red:1 black:3
write:4 red:2 black:2
write:4 red:3 black:1
write:5 red:0 black:3
write:5 red:1 black:2
write:5 red:2 black:1
write:5 red:3 black:0

caojinrong 2015-11-22
  • 打赏
  • 举报
回复
不好意思,算法有误,
                if (arry[i - 1] < arry[i])
                {
                    int tmp = arry[i - 1];
                    arry[i - 1] = arry[i];
                    arry[i] = tmp;
                    return true;
                }
此处应该把i后面比第i个元素大的最小值和第i元素互换,然后将i+1之后的元素按小至大排列,要是纠结结果的话可以自选修改。
qq_32529103 2015-11-20
  • 打赏
  • 举报
回复
谢谢各位,已经懂了。
秋的红果实 2015-11-20
  • 打赏
  • 举报
回复
只要各个球没有编号就好,白球一定是{1,2,3,4,5},剩下考虑红黑的
crystal_lz 2015-11-20
  • 打赏
  • 举报
回复
引用 9 楼 caojinrong 的回复:
19种组合、352种排列
        //编一个程序,从三个红球,五个白球,六个黑球中任意取出八个球,且其中必须有白球,输出所有可能的方案。
        static void Main()
        {
            int gIndex = 0, aIndex = 0;
            ConsoleColor[] colors = new ConsoleColor[] { ConsoleColor.White, ConsoleColor.Red, ConsoleColor.DarkGray };
            for (int white = 1; white <= 5; white++)
            {
                for (int red = 0; red <= 3; red++)
                {
                    int black = 8 - white - red;
                    if (black < 0 || black > 6) continue;    //白+红不足2个,抛弃

                    gIndex++;
                    //分别用0、1、2表示白球、红球、黑球
                    int[] arry = new int[8];
                    for (int i = 0; i < white; i++)
                        arry[i] = 0;
                    for (int i = 0; i < red; i++)
                        arry[i + white] = 1;
                    for (int i = 0; i < black; i++)
                        arry[7 - i] = 2;

                    do
                    {
                        aIndex++;
                        Console.Write("{0:00}:{1:000}:", gIndex, aIndex);
                        for (int i = 0; i < arry.Length; i++)
                        {
                            Console.ForegroundColor = colors[arry[i]];
                            Console.Write("●");
                        }
                        Console.WriteLine();
                        Console.ResetColor();
                    } while (Range(arry));
                }
            }
            Console.ReadKey();
        }

        private static bool Range(int[] arry)
        {
            for (int i = arry.Length - 1; i > 0; i--)
            {
                if (arry[i - 1] < arry[i])
                {
                    int tmp = arry[i - 1];
                    arry[i - 1] = arry[i];
                    arry[i] = tmp;
                    return true;
                }
            }
            return false;
        }
一共有20种 排列组合有多少种我是不知道 不过看你的打印来看 下面几个 应该就是三个红球的组合排法了 可是我随便想了一种组合 为什么没有看到? 红红白白白白..红????
caojinrong 2015-11-20
  • 打赏
  • 举报
回复
19种组合、352种排列
        //编一个程序,从三个红球,五个白球,六个黑球中任意取出八个球,且其中必须有白球,输出所有可能的方案。
static void Main()
{
int gIndex = 0, aIndex = 0;
ConsoleColor[] colors = new ConsoleColor[] { ConsoleColor.White, ConsoleColor.Red, ConsoleColor.DarkGray };
for (int white = 1; white <= 5; white++)
{
for (int red = 0; red <= 3; red++)
{
int black = 8 - white - red;
if (black < 0 || black > 6) continue; //白+红不足2个,抛弃

gIndex++;
//分别用0、1、2表示白球、红球、黑球
int[] arry = new int[8];
for (int i = 0; i < white; i++)
arry[i] = 0;
for (int i = 0; i < red; i++)
arry[i + white] = 1;
for (int i = 0; i < black; i++)
arry[7 - i] = 2;

do
{
aIndex++;
Console.Write("{0:00}:{1:000}:", gIndex, aIndex);
for (int i = 0; i < arry.Length; i++)
{
Console.ForegroundColor = colors[arry[i]];
Console.Write("●");
}
Console.WriteLine();
Console.ResetColor();
} while (Range(arry));
}
}
Console.ReadKey();
}

private static bool Range(int[] arry)
{
for (int i = arry.Length - 1; i > 0; i--)
{
if (arry[i - 1] < arry[i])
{
int tmp = arry[i - 1];
arry[i - 1] = arry[i];
arry[i] = tmp;
return true;
}
}
return false;
}

TimLee✿ 2015-11-19
  • 打赏
  • 举报
回复
引用 5 楼 crystal_lz 的回复:
[quote=引用 3 楼 hjq624779687 的回复:] [quote=引用 2 楼 crystal_lz 的回复:]

//白球可以是 1 - 5 个
for(int write = 1;write <= 5;write++){
    //红球可以是 0 - 3 个
    for(int red = 0;red <= 3;red++){
        //剩下的就是黑球
        Console.WriteLine(
            "write:" + write + 
            " red:" + red + 
            " black:" + (8 - write - red));
    }
}

write:1 red:0 black:7
write:1 red:1 black:6
write:1 red:2 black:5
write:1 red:3 black:4
write:2 red:0 black:6
write:2 red:1 black:5
write:2 red:2 black:4
write:2 red:3 black:3
write:3 red:0 black:5
write:3 red:1 black:4
write:3 red:2 black:3
write:3 red:3 black:2
write:4 red:0 black:4
write:4 red:1 black:3
write:4 red:2 black:2
write:4 red:3 black:1
write:5 red:0 black:3
write:5 red:1 black:2
write:5 red:2 black:1
write:5 red:3 black:0
....write....可能他还要求有排序什么的,想了有点久了。。。。[/quote] 求都是一样 还有什么排序?难道还要排列组合不成。。。再拿出来的球上面 还有什么排法不成?。。[/quote] 用C#还纠结排序? 数据防到list里面,然后Sort啊....
crystal_lz 2015-11-19
  • 打赏
  • 举报
回复
引用 3 楼 hjq624779687 的回复:
[quote=引用 2 楼 crystal_lz 的回复:]

//白球可以是 1 - 5 个
for(int write = 1;write <= 5;write++){
    //红球可以是 0 - 3 个
    for(int red = 0;red <= 3;red++){
        //剩下的就是黑球
        Console.WriteLine(
            "write:" + write + 
            " red:" + red + 
            " black:" + (8 - write - red));
    }
}

write:1 red:0 black:7
write:1 red:1 black:6
write:1 red:2 black:5
write:1 red:3 black:4
write:2 red:0 black:6
write:2 red:1 black:5
write:2 red:2 black:4
write:2 red:3 black:3
write:3 red:0 black:5
write:3 red:1 black:4
write:3 red:2 black:3
write:3 red:3 black:2
write:4 red:0 black:4
write:4 red:1 black:3
write:4 red:2 black:2
write:4 red:3 black:1
write:5 red:0 black:3
write:5 red:1 black:2
write:5 red:2 black:1
write:5 red:3 black:0
....write....可能他还要求有排序什么的,想了有点久了。。。。[/quote] 求都是一样 还有什么排序?难道还要排列组合不成。。。再拿出来的球上面 还有什么排法不成?。。
crystal_lz 2015-11-19
  • 打赏
  • 举报
回复
上面贴的 只是数据碰巧不会出现什么特殊情况 如果有什么特殊情况的 用这个

int nCount = 8;//总共拿出个数
int nRedCount = 100;
int nWriteCount = 100;
int nBlackCount = 1;
for (int write = 1; write <= nWriteCount && write <= nCount; write++) {
    for (int red = 0; red <= nRedCount && (write + red) <= nCount; red++) {
        //黑球不够凑够8个的情况下的情况下
        if (nCount - write - red > nBlackCount) continue;
        Console.WriteLine(
            "write:" + write + 
            " red:" + red + 
            " black:" + (nCount - write - red));
    }
}

write:1 red:6 black:1
write:1 red:7 black:0
write:2 red:5 black:1
write:2 red:6 black:0
write:3 red:4 black:1
write:3 red:5 black:0
write:4 red:3 black:1
write:4 red:4 black:0
write:5 red:2 black:1
write:5 red:3 black:0
write:6 red:1 black:1
write:6 red:2 black:0
write:7 red:0 black:1
write:7 red:1 black:0
write:8 red:0 black:0
夏天的枫 2015-11-19
  • 打赏
  • 举报
回复
引用 2 楼 crystal_lz 的回复:

//白球可以是 1 - 5 个
for(int write = 1;write <= 5;write++){
    //红球可以是 0 - 3 个
    for(int red = 0;red <= 3;red++){
        //剩下的就是黑球
        Console.WriteLine(
            "write:" + write + 
            " red:" + red + 
            " black:" + (8 - write - red));
    }
}

write:1 red:0 black:7
write:1 red:1 black:6
write:1 red:2 black:5
write:1 red:3 black:4
write:2 red:0 black:6
write:2 red:1 black:5
write:2 red:2 black:4
write:2 red:3 black:3
write:3 red:0 black:5
write:3 red:1 black:4
write:3 red:2 black:3
write:3 red:3 black:2
write:4 red:0 black:4
write:4 red:1 black:3
write:4 red:2 black:2
write:4 red:3 black:1
write:5 red:0 black:3
write:5 red:1 black:2
write:5 red:2 black:1
write:5 red:3 black:0
....write....可能他还要求有排序什么的,想了有点久了。。。。
crystal_lz 2015-11-19
  • 打赏
  • 举报
回复

//白球可以是 1 - 5 个
for(int write = 1;write <= 5;write++){
    //红球可以是 0 - 3 个
    for(int red = 0;red <= 3;red++){
        //剩下的就是黑球
        Console.WriteLine(
            "write:" + write + 
            " red:" + red + 
            " black:" + (8 - write - red));
    }
}

write:1 red:0 black:7
write:1 red:1 black:6
write:1 red:2 black:5
write:1 red:3 black:4
write:2 red:0 black:6
write:2 red:1 black:5
write:2 red:2 black:4
write:2 red:3 black:3
write:3 red:0 black:5
write:3 red:1 black:4
write:3 red:2 black:3
write:3 red:3 black:2
write:4 red:0 black:4
write:4 red:1 black:3
write:4 red:2 black:2
write:4 red:3 black:1
write:5 red:0 black:3
write:5 red:1 black:2
write:5 red:2 black:1
write:5 red:3 black:0
  • 打赏
  • 举报
回复
两个For循环遍历即可? 比如: for (int i = 1; i <= 5; i++) { for (int j = 1; j <= 3; j++) { if (i + j == 8) { Console.Writeline(“白球:i个;红球:j个”); } else { Console.Writeline("白球:i个;红球:j个;黑球:8-i-j个"); } } }

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧