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

时间:2017-12-16 22:34:00

标签: c# algorithm matrix matrix-multiplication

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

3 个答案:

答案 0 :(得分:0)

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

[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]

输出:

var newArr = [];



$.ajax({
    url: 'https://spreadsheets.google.com/feeds/list//od6/public/values?alt=json',
    success: function(data){
        var entryPoint = data.feed.entry;
        // data.feed.entry entry to arrays 
        for (i = 0; i < entryPoint.length; i++){
            var fName = entryPoint[i].gsx$firstname.$t;
            var lName = entryPoint[i].gsx$lastname.$t;
            var email = entryPoint[i].gsx$email.$t;
            var total = entryPoint[i].gsx$totalordered.$t;


            newArr.push(fName)

        }

    }


})

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

答案 1 :(得分: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");
}

答案 2 :(得分: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;
        }
    }
}
相关问题