C#每次迭代一个带有新值的If语句

时间:2014-10-13 13:23:41

标签: c# visual-studio-2012 if-statement cellular-automata

是否可以在每次迭代时使用新值迭代嵌套的if语句?我正在尝试构建一个1维元胞自动机(对于家庭作业,我不能否认它)而且我对C#完全不熟悉,因为下面的代码无疑会保证。我尝试使用最简单,最基本的DIY方法来创建这个程序,并让自己陷入困境。

我有一个长度为8的1和0的字符串,比如说

string y;
y = "11110000";

我想在8个子串集合中打破这个设置,每个集合包含y中的值和它两侧的单个值。所以从0开始计数,第3组将是110,第7组将是001.但是,子串只会提供第1到第6组,因为我不能按照我的喜好循环它们,所以我定义了以下内容 -

y1=y.Substring(7,1)+y+y.Substring(0,1);

使用y1我能够得到所有必要的子串。这些基本上定义如下 -

string a0, a1, a2, a3, a4, a5, a6, a7;
                    a0 = y1.Substring(0, 3);
                    a1 = y1.Substring(1, 3);
                    a2 = y1.Substring(2, 3);
                    a3 = y1.Substring(3, 3);
                    a4 = y1.Substring(4, 3);
                    a5 = y1.Substring(5, 3);
                    a6 = y1.Substring(6, 3);
                    a7 = y1.Substring(7, 3);

下一代细胞自动机的规则取决于该程序中的用户 - 也就是说用户可以选择子串,例如111-> 0或1用于所有迭代。如果表格按以下方式用于每个子字符串

,我使用了(非常多)
                     {
                        if (a0=="000")
                    {
                        Console.Write(a);
                        }
                        else if (a0=="001")
                        {
                            Console.Write(b);
                        }
                        else if (a0 =="010")
                        {
                            Console.Write(c);
                        }
                        else if (a0 == "011")
                        {
                            Console.Write(d);
                        }
                        else if (a0 == "100")
                        {
                            Console.Write(e);
                        }
                        else if (a0 == "101")
                        {
                            Console.Write(f);
                        }
                        else if (a0 == "110")
                        {
                            Console.Write(g);
                        }
                        else if (a0 == "111")
                        {
                            Console.Write(h);
                        }
                    }

其中a,b,c,d,e,f,g,h是整数并且是用户选择的规则。例如,假设用户决定每个000应该产生1值,然后a = 1。 b对应于{0,0,1},c对应于{0,1,0},依此类推。然而,这种方法的一个相当明显的问题是,我最终只有1代我无法得到的整数。我很想用这一代替换y1(转换成字符串)。如果这不可能,请告诉我!

This link might also clear things up a bit

1 个答案:

答案 0 :(得分:0)

以下是你可以获得A +:D

的方法
  private static int[,] HipPriestsHomework()
    {
        string y = "11110000";
        Console.WriteLine(y);
        var rules = new[]
        {
            new {pattern = 0, result = 0},
            new {pattern = 1, result = 1},
            new {pattern = 2, result = 1},
            new {pattern = 3, result = 1},
            new {pattern = 4, result = 1},
            new {pattern = 5, result = 0},
            new {pattern = 6, result = 0},
            new {pattern = 7, result = 0},
        };
        Dictionary<int, int> rulesLookup = new Dictionary<int, int>();
        foreach(var rule in rules)
        {
            rulesLookup.Add(rule.pattern, rule.result);
        }

        int numGenerations = 10;
        int inputSize = y.Length;
        int[,] output = new int[numGenerations, inputSize];

        int[] items = new int[y.Length];
        for(int inputIndex = 0; inputIndex< y.Length; inputIndex++)
        {
            string token = y.Substring(inputIndex, 1);
            int item = Convert.ToInt32(token);
            items[inputIndex] = item;
        }

        int[] working = new int[items.Length];
        items.CopyTo(working, 0);
        for (int generation = 0; generation < numGenerations; generation++)
        {
            for (uint y_scan = 0; y_scan < items.Length; y_scan++)
            {
                int a = items[(y_scan - 1) % items.Length];
                int b = items[y_scan % items.Length];
                int c = items[(y_scan + 1) % items.Length];
                int pattern = a << 2 | b << 1 | c;
                var match = rules[pattern];
                output[generation, y_scan] = match.result;
                working[y_scan] = match.result;
                Console.Write(match.result);
            }
            working.CopyTo(items, 0);
            Console.WriteLine();
        }

        return output;
    }