查找一个N x N网格,其每行和每列的xor相等

2021年4月28日19:56:54 发表评论 912 次浏览

本文概述

给定一个整数N,它是4的倍数,任务是找到一个N × N的网格,其每一行和每一列的位异或是相同的。

例子:

输入:N = 4
输出:
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
输入:N = 8
输出:
0 1 2 3 16 17 18 19
4 5 6 7 20 21 22 23
8 9 10 11 24 25 26 27
12 13 14 15 28 29 30 31
32 33 34 35 48 49 50 51
36 37 38 39 52 53 54 55
40 41 42 43 56 57 58 59
44 45 46 47 60 61 62 63

方法:要解决此问题, 请修复异或由于从0开始的4个连续数字的异或为0, 因此每一行和每一列的0为0。这是一个4 x 4矩阵的示例:

0 ^ 1 ^ 2 ^ 3 = 0
4 ^ 5 ^ 6 ^ 7 = 0
8 ^ 9 ^ 10 ^ 11 = 0
12 ^ 13 ^ 14 ^ 15 = 0等。

如果你在上面的示例中注意到, 每一行和每一列的xor为0。现在我们需要以这样的方式放置数字:每一行和每一列的xor为0。因此我们可以将N x N矩阵变成较小的4 x 4矩阵N/4行和列, 并以每行和列的xor为0的方式填充单元格。

下面是上述方法的实现:

C ++

//C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
  
//Function to find the n x n matrix
//that satisfies the given condition
void findGrid( int n)
{
     int arr[n][n];
  
     //Initialize x to 0
     int x = 0;
  
     //Divide the n x n matrix into n /4 matrices
     //for each of the n /4 rows where
     //each matrix is of size 4 x 4
     for ( int i = 0; i <n /4; i++) {
         for ( int j = 0; j <n /4; j++) {
             for ( int k = 0; k <4; k++) {
                 for ( int l = 0; l <4; l++) {
                     arr[i * 4 + k][j * 4 + l] = x;
                     x++;
                 }
             }
         }
     }
  
     //Print the generated matrix
     for ( int i = 0; i <n; i++) {
         for ( int j = 0; j <n; j++) {
             cout <<arr[i][j] <<" " ;
         }
         cout <<"\n" ;
     }
}
  
//Driver code
int main()
{
     int n = 4;
  
     findGrid(n);
  
     return 0;
}

Java

//Java implementation of the approach
import java.io.*;
  
class GFG 
{
      
//Function to find the n x n matrix
//that satisfies the given condition
static void findGrid( int n)
{
     int [][]arr = new int [n][n];
  
     //Initialize x to 0
     int x = 0 ;
  
     //Divide the n x n matrix into n /4 matrices
     //for each of the n /4 rows where
     //each matrix is of size 4 x 4
     for ( int i = 0 ; i <n /4 ; i++)
     {
         for ( int j = 0 ; j <n /4 ; j++) 
         {
             for ( int k = 0 ; k <4 ; k++) 
             {
                 for ( int l = 0 ; l <4 ; l++) 
                 {
                     arr[i * 4 + k][j * 4 + l] = x;
                     x++;
                 }
             }
         }
     }
  
     //Print the generated matrix
     for ( int i = 0 ; i <n; i++) 
     {
         for ( int j = 0 ; j <n; j++) 
         {
             System.out.print(arr[i][j] + " " );
         }
         System.out.println( " " );
     }
}
  
//Driver code
public static void main (String[] args)
{
     int n = 4 ;
      
     findGrid(n);
}
}
  
//This code is contributed by ajit.

Python3

# Python3 implementation of the approach 
  
# Function to find the n x n matrix 
# that satisfies the given condition 
def findGrid(n): 
  
     arr = [[ 0 for k in range (n)] 
               for l in range (n)] 
  
     # Initialize x to 0 
     x = 0
  
     # Divide the n x n matrix into n /4 matrices 
     # for each of the n /4 rows where 
     # each matrix is of size 4 x 4 
     for i in range (n //4 ): 
         for j in range (n //4 ): 
             for k in range ( 4 ): 
                 for l in range ( 4 ): 
                     arr[i * 4 + k][j * 4 + l] = x 
                     x + = 1
  
     # Print the generated matrix 
     for i in range (n): 
         for j in range (n): 
             print (arr[i][j], end = " " )
         print ()
  
# Driver code 
n = 4
findGrid(n) 
  
# This code is contributed by divyamohan123

C#

//C# implementation of the approach
using System;
      
class GFG 
{
      
//Function to find the n x n matrix
//that satisfies the given condition
static void findGrid( int n)
{
     int [, ]arr = new int [n, n];
  
     //Initialize x to 0
     int x = 0;
  
     //Divide the n x n matrix into n /4 matrices
     //for each of the n /4 rows where
     //each matrix is of size 4 x 4
     for ( int i = 0; i <n /4; i++)
     {
         for ( int j = 0; j <n /4; j++) 
         {
             for ( int k = 0; k <4; k++) 
             {
                 for ( int l = 0; l <4; l++) 
                 {
                     arr[i * 4 + k, j * 4 + l] = x;
                     x++;
                 }
             }
         }
     }
  
     //Print the generated matrix
     for ( int i = 0; i <n; i++) 
     {
         for ( int j = 0; j <n; j++) 
         {
             Console.Write(arr[i, j] + " " );
         }
         Console.WriteLine( " " );
     }
}
  
//Driver code
public static void Main (String[] args)
{
     int n = 4;
      
     findGrid(n);
}
}
  
//This code is contributed by PrinciRaj1992

输出如下:

0 1 2 3 
4 5 6 7 
8 9 10 11 
12 13 14 15

时间复杂度:O(n^2)


木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: