Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过矩阵生成与任何其他路径具有最大N相似性的所有路径_C#_Matrix_Path - Fatal编程技术网

C# 通过矩阵生成与任何其他路径具有最大N相似性的所有路径

C# 通过矩阵生成与任何其他路径具有最大N相似性的所有路径,c#,matrix,path,C#,Matrix,Path,我得到了一个X X X Y矩阵,从这个矩阵开始,我需要生成从一边(第一列)到另一边(最后一列)的所有可能的方法,但是在这个过程中只有N个点可以与任何其他生成的组合相同 我知道我可以生成所有的组合,并将它们与所有其他组合进行比较,以筛选出我想要的组合,但对于更大的矩阵(如16×16),这些组合对于许多人来说都是一种方式,可以生成所有组合,还可以将每个组合与其他组合进行比较 有没有一种方法可以生成相似度为max N的组合,而不必全部生成 示例:N=1 ["a", "a", "a"] ["b", "b

我得到了一个X X X Y矩阵,从这个矩阵开始,我需要生成从一边(第一列)到另一边(最后一列)的所有可能的方法,但是在这个过程中只有N个点可以与任何其他生成的组合相同

我知道我可以生成所有的组合,并将它们与所有其他组合进行比较,以筛选出我想要的组合,但对于更大的矩阵(如16×16),这些组合对于许多人来说都是一种方式,可以生成所有组合,还可以将每个组合与其他组合进行比较

有没有一种方法可以生成相似度为max N的组合,而不必全部生成

示例:N=1

["a", "a", "a"]
["b", "b", "b"]
["c", "c", "c"]
应该生成如下内容: aaa 神甫 行政协调会 工商管理学士 共同国家评估 驾驶室

我已经在这方面做了几天了,还没有找到任何好的解决方案,因此非常感谢您的帮助,如果可能的话,请使用C#。

Answer=y^(x-n)

首先忽略你的问题,概括起来,你有一个3x3的网格。因此:

x = 3;
y = 3;
n = 1;
因此,有y^x组合,即3^3=27

如果您想确保在此过程中没有一定数量的匹配,您可以简单地将列的数量减少该数量,以减少排列的数量

在您的示例中,N是1,因此将x减少1,得到x为2

现在3^2=6,这是你给出的答案

如果你要扩大这个范围,我相信这是准确的,但我有一个漫长的一周,所以如果我错过了什么,请随时告诉我

编辑
重新阅读您的问题后,我不确定自己是否理解正确,我很感兴趣,因此请让我知道……

我不确定如何立即降低空间复杂度,但是,您可以使用动态编程避免检查重复项,从而降低时间复杂度。通过一点额外的努力,通常动态规划问题的空间复杂度也可以降低

存在一个最优子结构,即路径只是独立但重叠的前缀(a+a=aa,aa+a=aaa)的总和。考虑到这一点,我们可以用以下方式解决3x3的问题

纸笔法:

确定第一选择的解决方案已经完成-a、b、c。 我们需要确定第二选择、第三选择等的解决方案

通过连接行+列来确定两个的前缀-这是两列可用的选项

a b c a aa ab ac b ba bb bc c ca cb cc a、b、c a aa ab ac 英国广播公司 c ca cb cc 以我们刚刚创建的前缀为例,将它们应用于我们最初的1x1解决方案-行+列

a b c aa aaa aab aac ba baa bab bac ca caa cab cac ab aba abb abc bb bba bbb bbc cb cba cbb cbc ac aca acb acc bc bca bcb bcc cc cca ccb ccc a、b、c aa aaa AAAB aac 巴巴巴巴 caa cab cac ababababc bbbbbbbbbbbbbbbbc cba cbb cbc aca acb acc bc bca bcb bcc 抄送抄送抄送抄送抄送抄送抄送抄送抄送抄送抄送抄送抄送抄送抄送抄送抄送抄送抄送抄送抄送抄送抄送抄送抄送抄送 一个n*n的解决方案就是这个方法重复n-1次

我也用C#写了这个

类程序
{
静态void Main(字符串[]参数)
{
int sizeOf=3;//问题的大小-ex 3x3
var vals=“abcdefghijklmnop.ToCharArray();//最多16个(abc在ex中)
//制造初始问题
字符串[]x=新字符串[sizeOf];
字符串[]y=新字符串[sizeOf];
对于(int i=0;i

在空间复杂度变得太大之前,我将其运行到9x9。这是一个非常有趣的问题。

请解释“我需要生成从一侧到另一侧的所有可能方法”。你的意思是从边上的单元格到另一个边吗?很抱歉不清楚,是的,我的意思是从第一列到最后一列。那么你的第二条路径应该是abbb而不是abb。不abccc,bbb,bccc,ccc,cbbb,cbaaa,abbcc,cbbaa,我得到了吗?路径只能通过第1-2-3列,所以长度不能超过3个字符我放弃;问题中没有解释的东西太多了。请随意修改,我将重新访问。一个更好的例子和解释会有所帮助。也许把你的整个家庭作业问题都贴出来,而不是转述出来。我认为他需要找出正确的路径;但是知道有多少(如果准确的话)可以帮助他提前逃跑。是的,在重读之后,我也得到了这样的印象。基本上需要x个字母的每一个组合,这些字母并不共享很多字母。看起来像是家庭作业!感谢您的帮助,这是一个非常好的解决方案,将为未来的项目保存它。我只需要16x16中的大约500k个组合,所以我最终随机选取这些组合,并根据哈希矩阵检查它们,其中的列表包含当前字符位于该位置的所有其他组合。做这件事我不需要c
class Program
{
    static void Main(string[] args)
    {
        int sizeOf = 3; //size of problem - ex 3x3
        var vals = "abcdefghijklmnop".ToCharArray(); //up to 16 (abc in ex)

        //Create initial problem
        String[] x = new String[sizeOf]; 
        String[] y = new String[sizeOf];

        for (int i = 0; i < x.Length; i++)
        {
            x[i] = vals[i].ToString();
            y[i] = vals[i].ToString();
        }

        //hold our solutions
        String[][] result = null;
        String[] temp = x;

        for (int i = 1; i < y.Length; i++)
        {
            result = getCombos(temp, y);

            temp = (from k in result
                    from l in k
                    select l).ToArray();
        }

        //Flatten out solution
        var finalResult = (from k in result
                           from l in k
                           select l).ToList();

        printArray(finalResult);
        Console.WriteLine("Total Count: {0}", finalResult.Count());

    }

    static void printArray(List<String> a)
    {
        foreach (var x in a)
        {
            Console.Write("{0} ", x);
        }
        Console.WriteLine();
    }

    static String[][] getCombos(String[] x, String[] y)
    {
        //Initialize array to hold solution
        String[][] prefixes = new String[x.Length][];
        for (int j = 0; j < x.Length; j++)
        {
            prefixes[j] = new String[y.Length];
        }

        //concat to form solution
        for (var i = 0; i < x.Length; i++)
        {
            for (var j = 0; j < y.Length; j++)
            {
                prefixes[i][j] = x[i] + y[j];
            }
        }
        return prefixes;
    }
}