我有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#中的解决方案,使用您提出的格式将所有答案写入文件中。
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;
}
}
}
为了制作完整的解决方案,我使用了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");
}
您可以将每个这样的数组视为编码基数为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,第二个位置在下一个,第四个位置在第四个,第三个位置在第五个,然后在其余街区的第一个位置。