更改照片中的特定像素,其中像素为数字,照片由数字组成

时间:2018-05-05 17:09:42

标签: c# algorithm recursion

我正在尝试创建一个程序,它接受一个数组RXK并将一些数字作为其数据。每个数字代表一个像素。例如

enter image description here

代表一张图片,每个数字都是一个像素。现在我想做的是选择一个特定的像素,我要求用户给我X,Y位置,然后将该像素更改为所需的值,并且如果这些像素彼此“接触”,则将具有相同初始值的所有像素更改为所选像素。如果我选择此配置,请举例说明

enter image description here

并选择左上角像素作为起始位置并将其值更改为5我得到此

enter image description here

这是我想要的。与所选像素具有相同值的4个底部像素不会改变,因为它们不接触触摸所选像素的任何像素。这就是我想要的。现在我遇到了我编写的代码的一些问题。 我创建了一个具有一些功能的类:

  1. 具有大小为RXK的bool值的静态数组,初始值均为false。这个数组的每个位置代表我之前是否检查过它的值(因为我使用了递归,如果我没有检查我是否曾经在这个像素之前导致无限循环)
  2. A具有存储此“照片”的每个值的实际数组
  3. 我有一个名为N的静态int值,它存储新值的值。
  4. 我有一个名为firstvalue的静态int值,它存储所选像素的初始值。
  5. 现在在这个类上我有了进行递归的方法。在创建新对象之前,我检查上,下,左,右方向的邻居像素是否为:

    1. 在数组内部,这意味着> -1和

    2.通过检查bool数组中的这个位置是否为假来从未访问过

    此像素的值与初始值相同。 现在对于某些配置,程序可以工作,但起点必须是0,0或者它不会改变所有需要更改的像素。例如 如果选择此配置

    enter image description here

    并选择了起点0,1我得到了这个

    enter image description here

    而不是我在选择初始位置0,0

    时得到的

    enter image description here

    现在对于一些配置为5x5像素的照片,该程序根本不起作用,并给我一个错误System.IndexOutOfRangeException

    enter image description here

    我无法找到问题所在,以及为什么有时它会完美运行,有时根本不起作用。我遇到的所有问题和错误都是IndexOutOfRangeException错误。我试图看看在问题运行期间值如何变化,但我一直无法找到问题。我真的很感激任何帮助。这是主方法的代码:

    static void Main(string[] args)
        {
            int X_position;
            int Y_position;
            int N;
            Console.WriteLine("Please write the number of rown and colums: ");
            Arrays.K = int.Parse(Console.ReadLine());
            Arrays.R = int.Parse(Console.ReadLine());
            Arrays.photo = new int[Arrays.R, Arrays.K];
            Arrays.validPositionHolder = new bool[Arrays.R, Arrays.K];
            Console.WriteLine("Please Wirte the data of the array: ");
            for (int i = 0; i < Arrays.R; i++)
            {
                for (int j = 0; j < Arrays.K; j++)
                {
                    Arrays.photo[i, j] = int.Parse(Console.ReadLine());
                }
            }
    
            for (int i = 0; i < Arrays.R; i++)
            {
                for (int j = 0; j < Arrays.K; j++)
                {
                    Arrays.validPositionHolder[i, j] = false;
                }
            }
    
            Console.WriteLine("Please write the coodrinate of the starting point: ");
            X_position = int.Parse(Console.ReadLine());
            Y_position = int.Parse(Console.ReadLine());
            Arrays.firstvalue = Arrays.photo[X_position, Y_position];
            Console.WriteLine("Please write the new value of the point:");
            Arrays.N = int.Parse(Console.ReadLine());
            Arrays a = new Arrays(X_position,Y_position);
            for (int i = 0; i < Arrays.R; i++)
            {
                for (int j = 0; j < Arrays.K; j++)
                {
                    Console.Write(Arrays.photo[i, j]);
                }
                Console.WriteLine();
            }
            Console.ReadKey();
        }
    

    这是我创建的类中的代码

    class Arrays
    {
        public static int firstvalue;
        public static int N;
        public static int[,] photo;
        public static int K;
        public static int R;
        public static bool[,] validPositionHolder;
        private int X_position01;
        private int Y_position01;
        object SubTree01;
        object SubTree02;
        object SubTree03;
        object SubTree04;
    
        public Arrays(int value01, int value02)
        {
    
            X_position01 = value01;
            Y_position01 = value02;
    
            ChangerOfValue();
        }
        private void ChangerOfValue()
        {
    
            if (X_position01 - 1 > -1)
            {
                if (Arrays.validPositionHolder[X_position01 - 1, Y_position01] == false)
                {
                    if (Arrays.photo[X_position01 - 1, Y_position01] == firstvalue)
                    {
                        Arrays.validPositionHolder[X_position01 - 1, Y_position01] = true;
                        Arrays.photo[X_position01, Y_position01] = Arrays.N;
                        Arrays.photo[X_position01 - 1, Y_position01] = Arrays.N;
                        SubTree01 = new Arrays(X_position01 - 1, Y_position01);
                    }
                }
            }
            if (Y_position01 - 1 > -1)
            {
                if (Arrays.validPositionHolder[X_position01, Y_position01 - 1] == false)
                {
                    if (Arrays.photo[X_position01, Y_position01 - 1] == firstvalue)
                    {
                        Arrays.validPositionHolder[X_position01, Y_position01 - 1] = true;
                        Arrays.photo[X_position01, Y_position01] = Arrays.N;
                        Arrays.photo[X_position01, Y_position01 - 1] = Arrays.N;
                        SubTree02 = new Arrays(X_position01, Y_position01 + 1);
                    }
                }
            }
            if (X_position01 + 1 < Arrays.R)
            {
                if (Arrays.validPositionHolder[X_position01 + 1, Y_position01] == false)
                {
                    if (Arrays.photo[X_position01 + 1, Y_position01] == firstvalue)
                    {
                        Arrays.validPositionHolder[X_position01 + 1, Y_position01] = true;
                        Arrays.photo[X_position01, Y_position01] = Arrays.N;
                        Arrays.photo[X_position01 + 1, Y_position01] = Arrays.N;
                        SubTree03 = new Arrays(X_position01 + 1, Y_position01);
                    }
                }
            }
            if (Y_position01 + 1 < Arrays.K)
            {
                if (Arrays.validPositionHolder[X_position01, Y_position01 + 1] == false)
                {
                    if (Arrays.photo[X_position01, Y_position01 + 1] == firstvalue)
                    {
                        Arrays.validPositionHolder[X_position01, Y_position01 + 1] = true;
                        Arrays.photo[X_position01, Y_position01] = Arrays.N;
                        Arrays.photo[X_position01, Y_position01 + 1] = Arrays.N;
                        SubTree04 = new Arrays(X_position01, Y_position01 + 1);
                    }
                }
            }
        }
    }
    

0 个答案:

没有答案