【问题标题】:Generate all possible binary matrix as string or generate all possible matrix将所有可能的二进制矩阵生成为字符串或生成所有可能的矩阵
【发布时间】:2017-12-16 22:33:59
【问题描述】:

我有如下的 12*3 矩阵

matrix = 0- [0,0,0]
         1- [0,0,0]
         2- [0,0,0]
            .......
        11- [0,0,0]

每一行必须只有 一个 选择作为值 1

matrix = 0- [1,0,0]
         1- [1,0,0]
         2- [1,0,0]
            .......
        11- [1,0,0]

在这种情况下我的答案数组是

Ans = {1,0,0,1,0,0,1,0,0,....,1,0,0}

我想生成所有答案,如下所示:

Ans = {1,0,0,1,0,0,1,0,0,....,1,0,0}
Ans = {0,1,0,1,0,0,1,0,0,....,1,0,0}
Ans = {0,0,1,1,0,0,1,0,0,....,1,0,0}
Ans = {1,0,0,0,1,0,1,0,0,....,1,0,0}

能否请您帮我选择最佳算法。

编辑:首选语言是 C#

【问题讨论】:

  • 从 0 到 3^12 - 1 以 3 为底数。每个这样的数字很容易看出编码一个唯一的解决方案。
  • @JohnColeman 如何将此基数 3 转换为唯一解?
  • 十二行对应于此类数字的 12 个位置。当给定位置的数字为 0 时,选择该行中的第一列。为1时,选择第二列,以此类推
  • 让别人帮你做作业并不能教给你任何东西。

标签: c# algorithm matrix matrix-multiplication


【解决方案1】:

c# 中的解决方案,将所有答案以您要求的格式写入文件中。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace DozeFilastres
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> lines = new List<string>();
            int[] finarr = new int[]{0,0,0,0,0,0,0,0,0,0,0,0};
            int aux=0;


            while(finarr[11]!=3)
            {
                finarr[0]=aux;
                lines.Add(printarr(finarr));
                aux++;
                if(aux==3)
                {
                    aux=0;
                    finarr[0]++;
                    for(int idx=0;idx<11;idx++)
                    {
                        if(finarr[idx]==3)
                        {
                            finarr[idx]=0;
                            finarr[idx+1]++;
                        }
                    }
                }

            }

            File.WriteAllLines("fichero.txt",lines.ToArray());
        }

        static string printarr(int[] arr)
        {
            string all="Ans = {";
            for(int idx=0;idx<12;idx++)
            {
                if(idx!=0)
                    all+=",";

                switch(arr[idx])
                {
                case 0:
                    all+="1,0,0";
                    break;
                case 1:
                    all+="0,1,0";
                    break;
                case 2:
                    all+="0,0,1";
                    break;
                }

            }
            all+="}";

            return all;
        }
    }
}

【讨论】:

    【解决方案2】:

    为了制作完整的解决方案,我使用了 c++:

    #include <stdio.h>
    void printarr(int arr[]);
    FILE *fileptr;
    FILE **file;
    int main()
    {
        int finarr[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
        int aux=0;
        file=&fileptr;
        fopen_s(file,"fichero.txt","w");
    
        while(finarr[11]!=3)
        {
            finarr[0]=aux;
            printarr(finarr);
            aux++;
            if(aux==3)
            {
                aux=0;
                finarr[0]++;
                for(int idx=0;idx<11;idx++)
                {
                    if(finarr[idx]==3)
                    {
                        finarr[idx]=0;
                        finarr[idx+1]++;
                    }
                }
            }
    
        }
    
        printarr(finarr);
    
        return 0;
    }
    
    void printarr(int arr[])
    {
        if(arr[11]==3)
            return;
        fprintf(fileptr,"Ans = {");
        for(int idx=0;idx<12;idx++)
        {
            if(idx!=0)
                fprintf(fileptr,",");
    
            switch(arr[idx])
            {
            case 0:
                fprintf(fileptr,"1,0,0");
                break;
            case 1:
                fprintf(fileptr,"0,1,0");
                break;
            case 2:
                fprintf(fileptr,"0,0,1");
                break;
            }
    
        }
        fprintf(fileptr,"}\n");
    }
    

    【讨论】:

    • 谢谢。你能用c#写吗?
    • @MasterProgrammer 事实上,我可以。
    【解决方案3】:

    您可以将每个这样的数组视为在 0 到 3^12 - 1 范围内以 3 为基数编码一个数字。以下 Python 脚本(带有 cmets 建议如何转换为 C#——一种我不知道的语言use) 展示了如何从这样的数字转到数组:

    def decode(n):
         A = [0]*36 #initialize array of 36 zeros
         for i in range(0,12): #for(int i = 0; i < 12; i++) in C#
              r = n % 3
              n = n // 3 #integer division, just use / in C# if n is an int
              A[3*i+r] = 1
         return A
    
    #test:
    n = 1*3**0 + 2*3**1 + 1*3**2 + 2*3**3 + 1*3**5
    A = decode(n)
    print(A)
    

    输出:

    [0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0]
    

    注意1在第一组3中的第二位,第二组3中的第三位,下一个中的第二位,第四位中的第一位,第五位中的第三位,然后在其余块中的第一个位置。

    【讨论】:

    • 谢谢,但我需要答案数组而不是矩阵,也在 c# 中
    • @MasterProgrammer 我调整了一个数组,但没有使用 c#。这个想法几乎是微不足道的,而且很容易用任何语言实现。问一个关于算法设计的问题,然后在事后抛出一个语言限制,这有点不一致。 Stack Overflow 不是编码服务。
    • @JohnColeman 他想要所有可能的组合。输出需要为 3^12 行。
    • @BlazeChill 一旦你有一个函数可以将一个整数解码为一个唯一的数组,那么在循环中使用这个函数真的很简单。 Stack Overflow 不是编码服务。如果 OP 想要将输出写入文件,OP 可以将输出写入文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    • 2015-03-01
    • 1970-01-01
    相关资源
    最近更新 更多