You are given a number N and you are asked to output an N \times N matrix consisting of numbers from 1 to N \times N according to a given pattern.
EXPLANATION:
To solve this problem, let’s first find out what the pattern really is.
By looking at the given matrix, we realize that each anti-diagonal of the matrix consists of some consecutive numbers written from top to bottom. the first anti-diagonal is composed of only number 1, the second is composed of numbers 2 and 3, and the following anti-diagonals are filled similarly.
So it turns out the task is fairly simple. We have to start from the first anti-diagonal, go through all of those diagonals one by one and write the numbers from top to bottom starting from 1.
So all that’s left is to go through anti-diagonals one by one efficiently. Let’s enumerate the rows of the matrix from top to bottom starting from 0. Similarly, let’s enumerate the columns from left to right starting from 0. Now let’s enumerate the anti-diagonals starting from 0. Note that based on our enumeration, the sum of row and column indices of all the cells of the matrix that are on the i^{th} anti-diagonal is equal to i. We can write a neat implementation based on this. We simply iterate over numbers from 0 up to 2 \times (N-1) and deal with the i^{th} anti-diagonal on the i^{th} iteration.
The time complexity of this solution is O(N^2)
Refer to the editorialist’s code to see the implementation of the described solution.
#include <stdio.h>
int main()
{
int i, j, k, m = 1, p = 1, l, q, n, w, t;
scanf("%d", &t);
while (t–)
{
scanf("%d", &n);
w = n - 1;
for (i = 1; i <= n; i++)
{
l = i;
q = 0;
if (i % 2 == 0)
k = (i * m) + m;
else
k = i * p;
for (j = 1; j <= n; j++)
{
if (i == n)
{
printf("%d ", k);
k = k + w;
w--;
}
else
{
printf("%d ", k);
k = k + l;
if (l < n - 1 && q == 0)
l++;
else
{
q = q + 1;
if (q <= 1)
l = n - 1;
else
l--;
}
}
}
printf("\n");
if (i % 2 == 0)
m++;
else
p++;
}
}
#include <stdio.h>
int main()
{
int i, j, k, m = 1, p = 1, l, q, n, w, t;
scanf("%d", &t);
while (t–)
{
scanf("%d", &n);
w = n - 1;
for (i = 1; i <= n; i++)
{
l = i;
q = 0;
if (i % 2 == 0)
k = (i * m) + m;
else
k = i * p;
for (j = 1; j <= n; j++)
{
if (i == n)
{
printf("%d ", k);
k = k + w;
w--;
}
else
{
printf("%d ", k);
k = k + l;
if (l < n - 1 && q == 0)
l++;
else
{
q = q + 1;
if (q <= 1)
l = n - 1;
else
l--;
}
}
}
printf("\n");
if (i % 2 == 0)
m++;
else
p++;
}
}
class pattern{
public static void main(String[] args) {
Scanner scan= new Scanner(System.in);
System.out.println(“enter the order”);
int n = scan.nextInt();
System.out.println(“enter the initial number”);
int ini=scan.nextInt();
int[][] real=new int [n][n];
int counting=ini;
for (int i=0;i<n*n-1 ;i++ ) {
for (int a=0;a<n ;a++ ) {
for (int b=0;b<n ;b++ ) {
if (a+b==i) {
real[a][b]=ini;
ini++;
}
}
}
}
for (int i=0;i<n ;i++ ) {
for (int j=0;j<n ;j++ ){
System.out.print(real[i][j]+" \t");
}
System.out.println();
}
}
}
****I still cant figure out why is a wrong solution
My solution, probably the smallest for i in range(0, n): for j in range(0, n): if i + j < n: arr[i][j] += (j+i)*(j+i+1)//2 + i+1 elif i + j >= n: arr[i][j] += (j+i)*(j+i+1)//2 + i+1 - (i + j + 1 - n) ** 2