我正在尝试创建一个程序,它接受一个数组RXK并将一些数字作为其数据。每个数字代表一个像素。例如
代表一张图片,每个数字都是一个像素。现在我想做的是选择一个特定的像素,我要求用户给我X,Y位置,然后将该像素更改为所需的值,并且如果这些像素彼此“接触”,则将具有相同初始值的所有像素更改为所选像素。如果我选择此配置,请举例说明
并选择左上角像素作为起始位置并将其值更改为5我得到此
这是我想要的。与所选像素具有相同值的4个底部像素不会改变,因为它们不接触触摸所选像素的任何像素。这就是我想要的。现在我遇到了我编写的代码的一些问题。 我创建了一个具有一些功能的类:
现在在这个类上我有了进行递归的方法。在创建新对象之前,我检查上,下,左,右方向的邻居像素是否为:
2.通过检查bool数组中的这个位置是否为假来从未访问过
此像素的值与初始值相同。 现在对于某些配置,程序可以工作,但起点必须是0,0或者它不会改变所有需要更改的像素。例如 如果选择此配置
并选择了起点0,1我得到了这个
而不是我在选择初始位置0,0
时得到的现在对于一些配置为5x5像素的照片,该程序根本不起作用,并给我一个错误System.IndexOutOfRangeException
我无法找到问题所在,以及为什么有时它会完美运行,有时根本不起作用。我遇到的所有问题和错误都是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);
}
}
}
}
}