我是用C#语言写的代码,都大差不差,入门者应该能看得懂
二维数组生成
假设二维数组是8*9,其实不论几乘几都可以做出来,改数就可以了
此处建立了一个随机的二维数组,
(C#二维数组的声明与其他语言不太一样,是 变量类型[ , ] 变量名 这样声明,其他语言多为 变量类型[ ] [ ] 变量名 如此)
int[,] arrc = new int[8, 9];
int[,] arrd = new int[8, 9];
Random rd = new Random(); //取随机数
//建立随机数组
for (int i = 0; i < arrc.GetLength(0); i++)
{
for (int j = 0; j < arrc.GetLength(1); j++)
{
arrc[i, j] = rd.Next(0, 2); //随机数的取值为0或1
Console.Write(arrc[i, j] + "\t"); //打印出来
}
Console.Write("\n");
}
Console.WriteLine("-------------------------------------------------------------------");
因为随机数取得数组实在是难以保证某一行某一列全是0;不好验证自己的算法对不对,故 而单独设置了第一行第一列全为0,如下 亦可采用直接定义二维数组元素的方法
//使数组第一行第一列变为0(方便验证后面做的对不对)
//GetLength()方法是用来获取二维数组的长度的方法
for (int j = 0; j < arrc.GetLength(1); j++) //括号中为1为获取列的长度
{
arrc[0, j] = 0; //置第一行为1
}
for (int i = 0; i < arrc.GetLength(0); i++) //括号中为0为获取行的长度
{
arrc[i, 0] = 0; //置第一列为1
}
Console.Write("\n");
直接定义二维数组的方法如下
int[,] array = new int[8, 9] { { 0,0,0,0,0,0,0,1,0,},
{ 0,0,0,0,0,0,0,0,0},
{ 0,0,1,1,0,0,0,0,0},
{ 0,0,0,0,0,0,0,0,0},
{ 0,0,0,0,0,0,0,0,0},
{ 0,0,0,0,0,0,1,0,0},
{ 0,0,0,0,0,0,0,0,0},
{ 0,0,0,0,0,0,0,0,0}};
当然第一个方法数是随机生成的,做出来的结果跟第二个也是不一样的(第一个麻烦主要还是因为博主太笨,每次都绕完弯路才想到更简单的方法)
函数实现
// 转换数组
int midn = 0;//声明一个变量用来标记某行或某列是否存在1
for (int i = 0; i < arrc.GetLength(0); i++)//从第1行开始遍历
{
for (int j = 0; j < arrc.GetLength(1); j++)
{
if (arrc[i, j] == 1)
{
midn = 1;
}
}//如果这一行出现了1 则标记该行 下面对该行所有数字转换成1 并放入数组d中
if (midn == 1)
{
for (int j = 0; j < arrc.GetLength(1); j++)
{
arrd[i, j] = 1;
}
midn = 0;
}
}
//上面的代码实现了将存在1的行全部变为1
//同理
for (int j = 0; j < arrc.GetLength(1); j++)
{
for (int i = 0; i < arrc.GetLength(0); i++)
{
if (arrc[i, j] == 1)
{
midn = 1;
}
}//如果这一列出现了1 则标记该列 下面对该列所有数字转换成1 并放入数组d中
if (midn == 1)
{
for (int i = 0; i < arrc.GetLength(0); i++)
{
arrd[i, j] = 1;
}
midn = 0;
}
}
//上面的代码实现了将存在1的列全部变为1
完成后,对数组遍历即可
//遍历数组
for (int i = 0; i < arrd.GetLength(0); i++)
{
for (int j = 0; j < arrd.GetLength(1); j++)
{
Console.Write(arrd[i, j] + "\t");
}
Console.WriteLine("\n");
}
Console.ReadLine();
如图,实现了对数组的转换,我知道有的同学这时候在骂作者笨,下面分享一个更简单的做法
Random r = new Random();
bool[] row = new bool[8];
bool[] col = new bool[9]; //设置两个数组分别记录行和列中为1元素的位置
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array.GetLength(1); j++)
{
//array[i, j] = r.Next(0, 2);
if (array[i, j] == 1)
{
//如果当前元素为1,则标记该行该列,将该行列row[i] col[i]置为ture,意为要变1
row[i] = true;
col[j] = true;
}
Console.Write(array[i, j] + "\t");
}
Console.WriteLine();
}
Console.WriteLine("--------------------------------------------------------------------------");
for (int i = 0; i < array.GetLength(0); i++)
{
for (int j = 0; j < array.GetLength(1); j++)
{
//遍历数组时,如果满足row[i] 跟col[i]同时为true,则该行该列全为1
if (row[i] || col[j])
{
array[i, j] = 1;
}
Console.Write(array[i, j] + "\t");
}
Console.WriteLine();
}
Console.ReadLine();
这个是不是简单得多?
结果
ok,very dick