(萌新向)给一个M*N数组,数组元素全部置为0或1,要求转换数组,将含有1的行或列全部置为1

我是用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

  • 8
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值