生成所有可能的二进制矩阵作为字符串或生成所有可能的矩阵

问题描述 投票:0回答:3

我有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#

c# algorithm matrix matrix-multiplication
3个回答
0
投票

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;
        }
    }
}

0
投票

为了制作完整的解决方案,我使用了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");
}

0
投票

您可以将每个这样的数组视为编码基数为3的数字,范围为0到3 ^ 12 - 1.以下Python脚本(包含建议如何转换为C#的注释 - 我不使用的语言)显示如何从这样的数字转到数组:

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,第二个位置在下一个,第四个位置在第四个,第三个位置在第五个,然后在其余街区的第一个位置。

© www.soinside.com 2019 - 2024. All rights reserved.