Spiral filling an existing matrix in their respective positions in descending order efficiently

Multi tool use
Multi tool use

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty margin-bottom:0;







up vote
2
down vote

favorite












Question:



  • Sort the boundary elements in descending order using any standard sorting technique and rearrange them in the matrix.


  • Calculate the sum of the boundary elements.


  • Display the original matrix, rearranged matrix and sum of the boundary elements.


Code:



import java.util.*;
class SortBoundary

int A, B, m, n;
static int sum=0;

void input() //Function for taking all the necessary inputs
m>10)

System.out.println("Invalid Range");
System.exit(0);

else

A = new int[m][m];
n = m*m;
B = new int[n]; // 1-D Array to store Boundary Elements

System.out.println("Enter the elements of the Matrix : ");
for(int i=0;i<m;i++)

for(int j=0;j<m;j++)

System.out.print("Enter a value : ");
A[i][j]=sc.nextInt();





/* The below function is used to store Boundary elements
* from array A to array B
*/
void convert()

int x=0;
for(int i=0;i<m;i++)

for(int j=0;j<m;j++)
i == m-1



void sortArray() //Function for sorting Boundary elements stored in array B

int c = 0;
for(int i=0; i<n-1; i++)

for(int j=i+1; j<n; j++)

if(B[i]<B[j]) // for ascending use B[i]>B[j]

c = B[i];
B[i] = B[j];
B[j] = c;





/* Function fillSpiral is filling the boundary of 2-D array in spiral
* way from the elements of 1-D array
*/
void fillSpiral()

int R1=0, R2=m-1, C1=0, C2=m-1, x=0;

for(int i=C1;i<=C2;i++) // accessing the top row

A[R1][i]=B[x++];

for(int i =R1+1;i<=R2;i++) // accessing the right column

A[i][C2]=B[x++];

for(int i =C2-1;i>=C1;i--) // accessing the bottom row

A[R2][i]=B[x++];

for(int i =R2-1;i>=R1+1;i--) // accessing the left column

A[i][C1]=B[x++];



void printArray() //Function for printing the array A

for(int i=0;i<m;i++)

for(int j=0;j<m;j++)

System.out.print(A[i][j]+"t");

System.out.println();



public static void main(String args)

SortBoundary ob = new SortBoundary();
ob.input();
System.out.println("*********************");
System.out.println("The original matrix:");
System.out.println("*********************");
ob.printArray(); //Printing the original array
ob.convert(); //Storing Boundary elements to a 1-D array
ob.sortArray(); //Sorting the 1-D array (i.e. Boundary Elements)
ob.fillSpiral(); //Storing the sorted Boundary elements back to original 2-D array

System.out.println("*********************");
System.out.println("The Rearranged matrix:");
System.out.println("*********************");
ob.printArray(); //Printing the rearranged array
System.out.println("*********************");
System.out.println("The sum of boundary elements is = "+sum); //Printing the sum of boundary elements




What I want to accomplish:



I want to fill the original array A with the sorted boundary elements B in a single loop at their respective positions in descending order.In my code I have used 4 different loops for accomplishing this task.Any suggestions or help to make my code better?







share|improve this question

















  • 1




    Cross-posted on Stack Overflow
    – Mast
    Feb 5 at 16:36










  • Does your code currently work as expected? As in, does it do the job?
    – Mast
    Feb 5 at 16:37










  • Yes.i want to improve it.
    – user159829
    Feb 5 at 16:38
















up vote
2
down vote

favorite












Question:



  • Sort the boundary elements in descending order using any standard sorting technique and rearrange them in the matrix.


  • Calculate the sum of the boundary elements.


  • Display the original matrix, rearranged matrix and sum of the boundary elements.


Code:



import java.util.*;
class SortBoundary

int A, B, m, n;
static int sum=0;

void input() //Function for taking all the necessary inputs
m>10)

System.out.println("Invalid Range");
System.exit(0);

else

A = new int[m][m];
n = m*m;
B = new int[n]; // 1-D Array to store Boundary Elements

System.out.println("Enter the elements of the Matrix : ");
for(int i=0;i<m;i++)

for(int j=0;j<m;j++)

System.out.print("Enter a value : ");
A[i][j]=sc.nextInt();





/* The below function is used to store Boundary elements
* from array A to array B
*/
void convert()

int x=0;
for(int i=0;i<m;i++)

for(int j=0;j<m;j++)
i == m-1



void sortArray() //Function for sorting Boundary elements stored in array B

int c = 0;
for(int i=0; i<n-1; i++)

for(int j=i+1; j<n; j++)

if(B[i]<B[j]) // for ascending use B[i]>B[j]

c = B[i];
B[i] = B[j];
B[j] = c;





/* Function fillSpiral is filling the boundary of 2-D array in spiral
* way from the elements of 1-D array
*/
void fillSpiral()

int R1=0, R2=m-1, C1=0, C2=m-1, x=0;

for(int i=C1;i<=C2;i++) // accessing the top row

A[R1][i]=B[x++];

for(int i =R1+1;i<=R2;i++) // accessing the right column

A[i][C2]=B[x++];

for(int i =C2-1;i>=C1;i--) // accessing the bottom row

A[R2][i]=B[x++];

for(int i =R2-1;i>=R1+1;i--) // accessing the left column

A[i][C1]=B[x++];



void printArray() //Function for printing the array A

for(int i=0;i<m;i++)

for(int j=0;j<m;j++)

System.out.print(A[i][j]+"t");

System.out.println();



public static void main(String args)

SortBoundary ob = new SortBoundary();
ob.input();
System.out.println("*********************");
System.out.println("The original matrix:");
System.out.println("*********************");
ob.printArray(); //Printing the original array
ob.convert(); //Storing Boundary elements to a 1-D array
ob.sortArray(); //Sorting the 1-D array (i.e. Boundary Elements)
ob.fillSpiral(); //Storing the sorted Boundary elements back to original 2-D array

System.out.println("*********************");
System.out.println("The Rearranged matrix:");
System.out.println("*********************");
ob.printArray(); //Printing the rearranged array
System.out.println("*********************");
System.out.println("The sum of boundary elements is = "+sum); //Printing the sum of boundary elements




What I want to accomplish:



I want to fill the original array A with the sorted boundary elements B in a single loop at their respective positions in descending order.In my code I have used 4 different loops for accomplishing this task.Any suggestions or help to make my code better?







share|improve this question

















  • 1




    Cross-posted on Stack Overflow
    – Mast
    Feb 5 at 16:36










  • Does your code currently work as expected? As in, does it do the job?
    – Mast
    Feb 5 at 16:37










  • Yes.i want to improve it.
    – user159829
    Feb 5 at 16:38












up vote
2
down vote

favorite









up vote
2
down vote

favorite











Question:



  • Sort the boundary elements in descending order using any standard sorting technique and rearrange them in the matrix.


  • Calculate the sum of the boundary elements.


  • Display the original matrix, rearranged matrix and sum of the boundary elements.


Code:



import java.util.*;
class SortBoundary

int A, B, m, n;
static int sum=0;

void input() //Function for taking all the necessary inputs
m>10)

System.out.println("Invalid Range");
System.exit(0);

else

A = new int[m][m];
n = m*m;
B = new int[n]; // 1-D Array to store Boundary Elements

System.out.println("Enter the elements of the Matrix : ");
for(int i=0;i<m;i++)

for(int j=0;j<m;j++)

System.out.print("Enter a value : ");
A[i][j]=sc.nextInt();





/* The below function is used to store Boundary elements
* from array A to array B
*/
void convert()

int x=0;
for(int i=0;i<m;i++)

for(int j=0;j<m;j++)
i == m-1



void sortArray() //Function for sorting Boundary elements stored in array B

int c = 0;
for(int i=0; i<n-1; i++)

for(int j=i+1; j<n; j++)

if(B[i]<B[j]) // for ascending use B[i]>B[j]

c = B[i];
B[i] = B[j];
B[j] = c;





/* Function fillSpiral is filling the boundary of 2-D array in spiral
* way from the elements of 1-D array
*/
void fillSpiral()

int R1=0, R2=m-1, C1=0, C2=m-1, x=0;

for(int i=C1;i<=C2;i++) // accessing the top row

A[R1][i]=B[x++];

for(int i =R1+1;i<=R2;i++) // accessing the right column

A[i][C2]=B[x++];

for(int i =C2-1;i>=C1;i--) // accessing the bottom row

A[R2][i]=B[x++];

for(int i =R2-1;i>=R1+1;i--) // accessing the left column

A[i][C1]=B[x++];



void printArray() //Function for printing the array A

for(int i=0;i<m;i++)

for(int j=0;j<m;j++)

System.out.print(A[i][j]+"t");

System.out.println();



public static void main(String args)

SortBoundary ob = new SortBoundary();
ob.input();
System.out.println("*********************");
System.out.println("The original matrix:");
System.out.println("*********************");
ob.printArray(); //Printing the original array
ob.convert(); //Storing Boundary elements to a 1-D array
ob.sortArray(); //Sorting the 1-D array (i.e. Boundary Elements)
ob.fillSpiral(); //Storing the sorted Boundary elements back to original 2-D array

System.out.println("*********************");
System.out.println("The Rearranged matrix:");
System.out.println("*********************");
ob.printArray(); //Printing the rearranged array
System.out.println("*********************");
System.out.println("The sum of boundary elements is = "+sum); //Printing the sum of boundary elements




What I want to accomplish:



I want to fill the original array A with the sorted boundary elements B in a single loop at their respective positions in descending order.In my code I have used 4 different loops for accomplishing this task.Any suggestions or help to make my code better?







share|improve this question













Question:



  • Sort the boundary elements in descending order using any standard sorting technique and rearrange them in the matrix.


  • Calculate the sum of the boundary elements.


  • Display the original matrix, rearranged matrix and sum of the boundary elements.


Code:



import java.util.*;
class SortBoundary

int A, B, m, n;
static int sum=0;

void input() //Function for taking all the necessary inputs
m>10)

System.out.println("Invalid Range");
System.exit(0);

else

A = new int[m][m];
n = m*m;
B = new int[n]; // 1-D Array to store Boundary Elements

System.out.println("Enter the elements of the Matrix : ");
for(int i=0;i<m;i++)

for(int j=0;j<m;j++)

System.out.print("Enter a value : ");
A[i][j]=sc.nextInt();





/* The below function is used to store Boundary elements
* from array A to array B
*/
void convert()

int x=0;
for(int i=0;i<m;i++)

for(int j=0;j<m;j++)
i == m-1



void sortArray() //Function for sorting Boundary elements stored in array B

int c = 0;
for(int i=0; i<n-1; i++)

for(int j=i+1; j<n; j++)

if(B[i]<B[j]) // for ascending use B[i]>B[j]

c = B[i];
B[i] = B[j];
B[j] = c;





/* Function fillSpiral is filling the boundary of 2-D array in spiral
* way from the elements of 1-D array
*/
void fillSpiral()

int R1=0, R2=m-1, C1=0, C2=m-1, x=0;

for(int i=C1;i<=C2;i++) // accessing the top row

A[R1][i]=B[x++];

for(int i =R1+1;i<=R2;i++) // accessing the right column

A[i][C2]=B[x++];

for(int i =C2-1;i>=C1;i--) // accessing the bottom row

A[R2][i]=B[x++];

for(int i =R2-1;i>=R1+1;i--) // accessing the left column

A[i][C1]=B[x++];



void printArray() //Function for printing the array A

for(int i=0;i<m;i++)

for(int j=0;j<m;j++)

System.out.print(A[i][j]+"t");

System.out.println();



public static void main(String args)

SortBoundary ob = new SortBoundary();
ob.input();
System.out.println("*********************");
System.out.println("The original matrix:");
System.out.println("*********************");
ob.printArray(); //Printing the original array
ob.convert(); //Storing Boundary elements to a 1-D array
ob.sortArray(); //Sorting the 1-D array (i.e. Boundary Elements)
ob.fillSpiral(); //Storing the sorted Boundary elements back to original 2-D array

System.out.println("*********************");
System.out.println("The Rearranged matrix:");
System.out.println("*********************");
ob.printArray(); //Printing the rearranged array
System.out.println("*********************");
System.out.println("The sum of boundary elements is = "+sum); //Printing the sum of boundary elements




What I want to accomplish:



I want to fill the original array A with the sorted boundary elements B in a single loop at their respective positions in descending order.In my code I have used 4 different loops for accomplishing this task.Any suggestions or help to make my code better?









share|improve this question












share|improve this question




share|improve this question








edited Feb 5 at 19:05









Billal BEGUERADJ

1




1









asked Feb 5 at 16:27







user159829














  • 1




    Cross-posted on Stack Overflow
    – Mast
    Feb 5 at 16:36










  • Does your code currently work as expected? As in, does it do the job?
    – Mast
    Feb 5 at 16:37










  • Yes.i want to improve it.
    – user159829
    Feb 5 at 16:38












  • 1




    Cross-posted on Stack Overflow
    – Mast
    Feb 5 at 16:36










  • Does your code currently work as expected? As in, does it do the job?
    – Mast
    Feb 5 at 16:37










  • Yes.i want to improve it.
    – user159829
    Feb 5 at 16:38







1




1




Cross-posted on Stack Overflow
– Mast
Feb 5 at 16:36




Cross-posted on Stack Overflow
– Mast
Feb 5 at 16:36












Does your code currently work as expected? As in, does it do the job?
– Mast
Feb 5 at 16:37




Does your code currently work as expected? As in, does it do the job?
– Mast
Feb 5 at 16:37












Yes.i want to improve it.
– user159829
Feb 5 at 16:38




Yes.i want to improve it.
– user159829
Feb 5 at 16:38










1 Answer
1






active

oldest

votes

















up vote
1
down vote



accepted










Have no idea what's your question but here is a short method that's placing a boarder to a matrix. You could use the a as index for the B array.



private static void placeBoarders(int matrix, int n) 
int a = 0;

for (int i = 0; i < 4 * (n-1); i++)
switch (i/(n - 1))
case 0:
matrix[i%(n-1)][0] = a;
break;
case 1:
matrix[n-1][i%(n-1)] = a;
break;
case 2:
matrix[(n - 1) - i%(n-1)][n-1] = a;
break;
case 3:
matrix[0][(n-1) - i%(n-1)] = a;
break;
default:
throw new IndexOutOfBoundsException();

a++;




The logic I've used here is that if I split the boarder to four equal chunks and I start from (top left -> bottom left -> bottom right -> top right -> top left) then I will have four pieces of size n-1. If you write it dawn on a paper then it will take like 5 mins to calculate the indexes.



For the opposite direction (top left -> top right -> bottom right -> bottom left -> top left) you should swap the matrix indexes just like this:



matrix[i%(n-1)][0] >> matrix[0][i%(n-1)]
matrix[n-1][i%(n-1)] >> matrix[i%(n-1)][n-1]
matrix[(n - 1) - i%(n-1)][n-1] >> matrix[n-1][(n - 1) - i%(n-1)]
matrix[0][(n-1) - i%(n-1)] >> matrix[(n-1) - i%(n-1)][0]


and even add some more clarity I will define some variables so the things get a bit clear for you:



private static void placeBoarders(int matrix, int n) 
for (int i = 0, size = (n - 1), a = 0, chunk, chunkIndex; i < 4 * size; i++)
chunk = i / size;
chunkIndex = i % size;
switch (chunk)
case 0:
matrix[0][chunkIndex] = a;
break;
case 1:
matrix[chunkIndex][size] = a;
break;
case 2:
matrix[size][size - chunkIndex] = a;
break;
case 3:
matrix[size - chunkIndex][0] = a;
break;
default:
throw new IndexOutOfBoundsException();

a++;




Here instead of using matrix[X][Y] = a, you should use a as index for the sorted B array so it will be like matrix[X][Y] = B[a];



If you need to take the indexes of the the matrix starting from (0,0) in the direction ( top left -> top right -> bottom right -> bottom left -> top right) then you could use this code :



private static void fillSpiralMatrix(int matrix, int n) 
for (int step = 0, a = 0, size; step < n/2; step++)
size = (n - step * 2 - 1);
for (int i = 0, chunk, chunkIndex, chunkOffset; i < 4 * size; i++)
chunk = i / size;
chunkIndex = i % size;
chunkOffset = n - step - 1;
switch (chunk)
case 0:
matrix[step][chunkIndex + step] = a;
break;
case 1:
matrix[chunkIndex + step][chunkOffset] = a;
break;
case 2:
matrix[chunkOffset][chunkOffset - chunkIndex] = a;
break;
case 3:
matrix[chunkOffset - chunkIndex][step] = a;
break;
default:
throw new IndexOutOfBoundsException();

a++;

if (n % 2 == 1)
matrix[n/2][n/2] = n * n - 1;





In this case we do define






share|improve this answer























  • My array A has the original array and Array B has the boundary elements of which I have found out the sum and also sorted it .Now my task is to fill the elements of array B in array A spirally.Why spirally you might ask? This is because I have to show the original array elements with the boundary elements .
    – user159829
    Feb 6 at 1:32










  • If I get it right you have to fill the whole matrix not only the boarders ? is that correct :?
    – dbl
    Feb 6 at 8:31










  • yes.Only the borders should be in descending order.For example consider the border matrix has [25,23,15,9,0,-2....] then 25 should be at (0,0) coordinates and like that the other elements should be arranged in a spiral order.
    – user159829
    Feb 6 at 8:47










  • I will edit my answer but still not sure if I got your point correctly :)
    – dbl
    Feb 6 at 9:20










  • Sorry I meant circular filling of boundaries in descending order not spiral.
    – user159829
    Feb 6 at 9:22










Your Answer




StackExchange.ifUsing("editor", function ()
return StackExchange.using("mathjaxEditing", function ()
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix)
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
);
);
, "mathjax-editing");

StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");

StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "196"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);

else
createEditor();

);

function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
convertImagesToLinks: false,
noModals: false,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);



);








 

draft saved


draft discarded


















StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f186847%2fspiral-filling-an-existing-matrix-in-their-respective-positions-in-descending-or%23new-answer', 'question_page');

);

Post as a guest





























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes








up vote
1
down vote



accepted










Have no idea what's your question but here is a short method that's placing a boarder to a matrix. You could use the a as index for the B array.



private static void placeBoarders(int matrix, int n) 
int a = 0;

for (int i = 0; i < 4 * (n-1); i++)
switch (i/(n - 1))
case 0:
matrix[i%(n-1)][0] = a;
break;
case 1:
matrix[n-1][i%(n-1)] = a;
break;
case 2:
matrix[(n - 1) - i%(n-1)][n-1] = a;
break;
case 3:
matrix[0][(n-1) - i%(n-1)] = a;
break;
default:
throw new IndexOutOfBoundsException();

a++;




The logic I've used here is that if I split the boarder to four equal chunks and I start from (top left -> bottom left -> bottom right -> top right -> top left) then I will have four pieces of size n-1. If you write it dawn on a paper then it will take like 5 mins to calculate the indexes.



For the opposite direction (top left -> top right -> bottom right -> bottom left -> top left) you should swap the matrix indexes just like this:



matrix[i%(n-1)][0] >> matrix[0][i%(n-1)]
matrix[n-1][i%(n-1)] >> matrix[i%(n-1)][n-1]
matrix[(n - 1) - i%(n-1)][n-1] >> matrix[n-1][(n - 1) - i%(n-1)]
matrix[0][(n-1) - i%(n-1)] >> matrix[(n-1) - i%(n-1)][0]


and even add some more clarity I will define some variables so the things get a bit clear for you:



private static void placeBoarders(int matrix, int n) 
for (int i = 0, size = (n - 1), a = 0, chunk, chunkIndex; i < 4 * size; i++)
chunk = i / size;
chunkIndex = i % size;
switch (chunk)
case 0:
matrix[0][chunkIndex] = a;
break;
case 1:
matrix[chunkIndex][size] = a;
break;
case 2:
matrix[size][size - chunkIndex] = a;
break;
case 3:
matrix[size - chunkIndex][0] = a;
break;
default:
throw new IndexOutOfBoundsException();

a++;




Here instead of using matrix[X][Y] = a, you should use a as index for the sorted B array so it will be like matrix[X][Y] = B[a];



If you need to take the indexes of the the matrix starting from (0,0) in the direction ( top left -> top right -> bottom right -> bottom left -> top right) then you could use this code :



private static void fillSpiralMatrix(int matrix, int n) 
for (int step = 0, a = 0, size; step < n/2; step++)
size = (n - step * 2 - 1);
for (int i = 0, chunk, chunkIndex, chunkOffset; i < 4 * size; i++)
chunk = i / size;
chunkIndex = i % size;
chunkOffset = n - step - 1;
switch (chunk)
case 0:
matrix[step][chunkIndex + step] = a;
break;
case 1:
matrix[chunkIndex + step][chunkOffset] = a;
break;
case 2:
matrix[chunkOffset][chunkOffset - chunkIndex] = a;
break;
case 3:
matrix[chunkOffset - chunkIndex][step] = a;
break;
default:
throw new IndexOutOfBoundsException();

a++;

if (n % 2 == 1)
matrix[n/2][n/2] = n * n - 1;





In this case we do define






share|improve this answer























  • My array A has the original array and Array B has the boundary elements of which I have found out the sum and also sorted it .Now my task is to fill the elements of array B in array A spirally.Why spirally you might ask? This is because I have to show the original array elements with the boundary elements .
    – user159829
    Feb 6 at 1:32










  • If I get it right you have to fill the whole matrix not only the boarders ? is that correct :?
    – dbl
    Feb 6 at 8:31










  • yes.Only the borders should be in descending order.For example consider the border matrix has [25,23,15,9,0,-2....] then 25 should be at (0,0) coordinates and like that the other elements should be arranged in a spiral order.
    – user159829
    Feb 6 at 8:47










  • I will edit my answer but still not sure if I got your point correctly :)
    – dbl
    Feb 6 at 9:20










  • Sorry I meant circular filling of boundaries in descending order not spiral.
    – user159829
    Feb 6 at 9:22














up vote
1
down vote



accepted










Have no idea what's your question but here is a short method that's placing a boarder to a matrix. You could use the a as index for the B array.



private static void placeBoarders(int matrix, int n) 
int a = 0;

for (int i = 0; i < 4 * (n-1); i++)
switch (i/(n - 1))
case 0:
matrix[i%(n-1)][0] = a;
break;
case 1:
matrix[n-1][i%(n-1)] = a;
break;
case 2:
matrix[(n - 1) - i%(n-1)][n-1] = a;
break;
case 3:
matrix[0][(n-1) - i%(n-1)] = a;
break;
default:
throw new IndexOutOfBoundsException();

a++;




The logic I've used here is that if I split the boarder to four equal chunks and I start from (top left -> bottom left -> bottom right -> top right -> top left) then I will have four pieces of size n-1. If you write it dawn on a paper then it will take like 5 mins to calculate the indexes.



For the opposite direction (top left -> top right -> bottom right -> bottom left -> top left) you should swap the matrix indexes just like this:



matrix[i%(n-1)][0] >> matrix[0][i%(n-1)]
matrix[n-1][i%(n-1)] >> matrix[i%(n-1)][n-1]
matrix[(n - 1) - i%(n-1)][n-1] >> matrix[n-1][(n - 1) - i%(n-1)]
matrix[0][(n-1) - i%(n-1)] >> matrix[(n-1) - i%(n-1)][0]


and even add some more clarity I will define some variables so the things get a bit clear for you:



private static void placeBoarders(int matrix, int n) 
for (int i = 0, size = (n - 1), a = 0, chunk, chunkIndex; i < 4 * size; i++)
chunk = i / size;
chunkIndex = i % size;
switch (chunk)
case 0:
matrix[0][chunkIndex] = a;
break;
case 1:
matrix[chunkIndex][size] = a;
break;
case 2:
matrix[size][size - chunkIndex] = a;
break;
case 3:
matrix[size - chunkIndex][0] = a;
break;
default:
throw new IndexOutOfBoundsException();

a++;




Here instead of using matrix[X][Y] = a, you should use a as index for the sorted B array so it will be like matrix[X][Y] = B[a];



If you need to take the indexes of the the matrix starting from (0,0) in the direction ( top left -> top right -> bottom right -> bottom left -> top right) then you could use this code :



private static void fillSpiralMatrix(int matrix, int n) 
for (int step = 0, a = 0, size; step < n/2; step++)
size = (n - step * 2 - 1);
for (int i = 0, chunk, chunkIndex, chunkOffset; i < 4 * size; i++)
chunk = i / size;
chunkIndex = i % size;
chunkOffset = n - step - 1;
switch (chunk)
case 0:
matrix[step][chunkIndex + step] = a;
break;
case 1:
matrix[chunkIndex + step][chunkOffset] = a;
break;
case 2:
matrix[chunkOffset][chunkOffset - chunkIndex] = a;
break;
case 3:
matrix[chunkOffset - chunkIndex][step] = a;
break;
default:
throw new IndexOutOfBoundsException();

a++;

if (n % 2 == 1)
matrix[n/2][n/2] = n * n - 1;





In this case we do define






share|improve this answer























  • My array A has the original array and Array B has the boundary elements of which I have found out the sum and also sorted it .Now my task is to fill the elements of array B in array A spirally.Why spirally you might ask? This is because I have to show the original array elements with the boundary elements .
    – user159829
    Feb 6 at 1:32










  • If I get it right you have to fill the whole matrix not only the boarders ? is that correct :?
    – dbl
    Feb 6 at 8:31










  • yes.Only the borders should be in descending order.For example consider the border matrix has [25,23,15,9,0,-2....] then 25 should be at (0,0) coordinates and like that the other elements should be arranged in a spiral order.
    – user159829
    Feb 6 at 8:47










  • I will edit my answer but still not sure if I got your point correctly :)
    – dbl
    Feb 6 at 9:20










  • Sorry I meant circular filling of boundaries in descending order not spiral.
    – user159829
    Feb 6 at 9:22












up vote
1
down vote



accepted







up vote
1
down vote



accepted






Have no idea what's your question but here is a short method that's placing a boarder to a matrix. You could use the a as index for the B array.



private static void placeBoarders(int matrix, int n) 
int a = 0;

for (int i = 0; i < 4 * (n-1); i++)
switch (i/(n - 1))
case 0:
matrix[i%(n-1)][0] = a;
break;
case 1:
matrix[n-1][i%(n-1)] = a;
break;
case 2:
matrix[(n - 1) - i%(n-1)][n-1] = a;
break;
case 3:
matrix[0][(n-1) - i%(n-1)] = a;
break;
default:
throw new IndexOutOfBoundsException();

a++;




The logic I've used here is that if I split the boarder to four equal chunks and I start from (top left -> bottom left -> bottom right -> top right -> top left) then I will have four pieces of size n-1. If you write it dawn on a paper then it will take like 5 mins to calculate the indexes.



For the opposite direction (top left -> top right -> bottom right -> bottom left -> top left) you should swap the matrix indexes just like this:



matrix[i%(n-1)][0] >> matrix[0][i%(n-1)]
matrix[n-1][i%(n-1)] >> matrix[i%(n-1)][n-1]
matrix[(n - 1) - i%(n-1)][n-1] >> matrix[n-1][(n - 1) - i%(n-1)]
matrix[0][(n-1) - i%(n-1)] >> matrix[(n-1) - i%(n-1)][0]


and even add some more clarity I will define some variables so the things get a bit clear for you:



private static void placeBoarders(int matrix, int n) 
for (int i = 0, size = (n - 1), a = 0, chunk, chunkIndex; i < 4 * size; i++)
chunk = i / size;
chunkIndex = i % size;
switch (chunk)
case 0:
matrix[0][chunkIndex] = a;
break;
case 1:
matrix[chunkIndex][size] = a;
break;
case 2:
matrix[size][size - chunkIndex] = a;
break;
case 3:
matrix[size - chunkIndex][0] = a;
break;
default:
throw new IndexOutOfBoundsException();

a++;




Here instead of using matrix[X][Y] = a, you should use a as index for the sorted B array so it will be like matrix[X][Y] = B[a];



If you need to take the indexes of the the matrix starting from (0,0) in the direction ( top left -> top right -> bottom right -> bottom left -> top right) then you could use this code :



private static void fillSpiralMatrix(int matrix, int n) 
for (int step = 0, a = 0, size; step < n/2; step++)
size = (n - step * 2 - 1);
for (int i = 0, chunk, chunkIndex, chunkOffset; i < 4 * size; i++)
chunk = i / size;
chunkIndex = i % size;
chunkOffset = n - step - 1;
switch (chunk)
case 0:
matrix[step][chunkIndex + step] = a;
break;
case 1:
matrix[chunkIndex + step][chunkOffset] = a;
break;
case 2:
matrix[chunkOffset][chunkOffset - chunkIndex] = a;
break;
case 3:
matrix[chunkOffset - chunkIndex][step] = a;
break;
default:
throw new IndexOutOfBoundsException();

a++;

if (n % 2 == 1)
matrix[n/2][n/2] = n * n - 1;





In this case we do define






share|improve this answer















Have no idea what's your question but here is a short method that's placing a boarder to a matrix. You could use the a as index for the B array.



private static void placeBoarders(int matrix, int n) 
int a = 0;

for (int i = 0; i < 4 * (n-1); i++)
switch (i/(n - 1))
case 0:
matrix[i%(n-1)][0] = a;
break;
case 1:
matrix[n-1][i%(n-1)] = a;
break;
case 2:
matrix[(n - 1) - i%(n-1)][n-1] = a;
break;
case 3:
matrix[0][(n-1) - i%(n-1)] = a;
break;
default:
throw new IndexOutOfBoundsException();

a++;




The logic I've used here is that if I split the boarder to four equal chunks and I start from (top left -> bottom left -> bottom right -> top right -> top left) then I will have four pieces of size n-1. If you write it dawn on a paper then it will take like 5 mins to calculate the indexes.



For the opposite direction (top left -> top right -> bottom right -> bottom left -> top left) you should swap the matrix indexes just like this:



matrix[i%(n-1)][0] >> matrix[0][i%(n-1)]
matrix[n-1][i%(n-1)] >> matrix[i%(n-1)][n-1]
matrix[(n - 1) - i%(n-1)][n-1] >> matrix[n-1][(n - 1) - i%(n-1)]
matrix[0][(n-1) - i%(n-1)] >> matrix[(n-1) - i%(n-1)][0]


and even add some more clarity I will define some variables so the things get a bit clear for you:



private static void placeBoarders(int matrix, int n) 
for (int i = 0, size = (n - 1), a = 0, chunk, chunkIndex; i < 4 * size; i++)
chunk = i / size;
chunkIndex = i % size;
switch (chunk)
case 0:
matrix[0][chunkIndex] = a;
break;
case 1:
matrix[chunkIndex][size] = a;
break;
case 2:
matrix[size][size - chunkIndex] = a;
break;
case 3:
matrix[size - chunkIndex][0] = a;
break;
default:
throw new IndexOutOfBoundsException();

a++;




Here instead of using matrix[X][Y] = a, you should use a as index for the sorted B array so it will be like matrix[X][Y] = B[a];



If you need to take the indexes of the the matrix starting from (0,0) in the direction ( top left -> top right -> bottom right -> bottom left -> top right) then you could use this code :



private static void fillSpiralMatrix(int matrix, int n) 
for (int step = 0, a = 0, size; step < n/2; step++)
size = (n - step * 2 - 1);
for (int i = 0, chunk, chunkIndex, chunkOffset; i < 4 * size; i++)
chunk = i / size;
chunkIndex = i % size;
chunkOffset = n - step - 1;
switch (chunk)
case 0:
matrix[step][chunkIndex + step] = a;
break;
case 1:
matrix[chunkIndex + step][chunkOffset] = a;
break;
case 2:
matrix[chunkOffset][chunkOffset - chunkIndex] = a;
break;
case 3:
matrix[chunkOffset - chunkIndex][step] = a;
break;
default:
throw new IndexOutOfBoundsException();

a++;

if (n % 2 == 1)
matrix[n/2][n/2] = n * n - 1;





In this case we do define







share|improve this answer















share|improve this answer



share|improve this answer








edited Feb 6 at 9:50


























answered Feb 5 at 17:51









dbl

1413




1413











  • My array A has the original array and Array B has the boundary elements of which I have found out the sum and also sorted it .Now my task is to fill the elements of array B in array A spirally.Why spirally you might ask? This is because I have to show the original array elements with the boundary elements .
    – user159829
    Feb 6 at 1:32










  • If I get it right you have to fill the whole matrix not only the boarders ? is that correct :?
    – dbl
    Feb 6 at 8:31










  • yes.Only the borders should be in descending order.For example consider the border matrix has [25,23,15,9,0,-2....] then 25 should be at (0,0) coordinates and like that the other elements should be arranged in a spiral order.
    – user159829
    Feb 6 at 8:47










  • I will edit my answer but still not sure if I got your point correctly :)
    – dbl
    Feb 6 at 9:20










  • Sorry I meant circular filling of boundaries in descending order not spiral.
    – user159829
    Feb 6 at 9:22
















  • My array A has the original array and Array B has the boundary elements of which I have found out the sum and also sorted it .Now my task is to fill the elements of array B in array A spirally.Why spirally you might ask? This is because I have to show the original array elements with the boundary elements .
    – user159829
    Feb 6 at 1:32










  • If I get it right you have to fill the whole matrix not only the boarders ? is that correct :?
    – dbl
    Feb 6 at 8:31










  • yes.Only the borders should be in descending order.For example consider the border matrix has [25,23,15,9,0,-2....] then 25 should be at (0,0) coordinates and like that the other elements should be arranged in a spiral order.
    – user159829
    Feb 6 at 8:47










  • I will edit my answer but still not sure if I got your point correctly :)
    – dbl
    Feb 6 at 9:20










  • Sorry I meant circular filling of boundaries in descending order not spiral.
    – user159829
    Feb 6 at 9:22















My array A has the original array and Array B has the boundary elements of which I have found out the sum and also sorted it .Now my task is to fill the elements of array B in array A spirally.Why spirally you might ask? This is because I have to show the original array elements with the boundary elements .
– user159829
Feb 6 at 1:32




My array A has the original array and Array B has the boundary elements of which I have found out the sum and also sorted it .Now my task is to fill the elements of array B in array A spirally.Why spirally you might ask? This is because I have to show the original array elements with the boundary elements .
– user159829
Feb 6 at 1:32












If I get it right you have to fill the whole matrix not only the boarders ? is that correct :?
– dbl
Feb 6 at 8:31




If I get it right you have to fill the whole matrix not only the boarders ? is that correct :?
– dbl
Feb 6 at 8:31












yes.Only the borders should be in descending order.For example consider the border matrix has [25,23,15,9,0,-2....] then 25 should be at (0,0) coordinates and like that the other elements should be arranged in a spiral order.
– user159829
Feb 6 at 8:47




yes.Only the borders should be in descending order.For example consider the border matrix has [25,23,15,9,0,-2....] then 25 should be at (0,0) coordinates and like that the other elements should be arranged in a spiral order.
– user159829
Feb 6 at 8:47












I will edit my answer but still not sure if I got your point correctly :)
– dbl
Feb 6 at 9:20




I will edit my answer but still not sure if I got your point correctly :)
– dbl
Feb 6 at 9:20












Sorry I meant circular filling of boundaries in descending order not spiral.
– user159829
Feb 6 at 9:22




Sorry I meant circular filling of boundaries in descending order not spiral.
– user159829
Feb 6 at 9:22












 

draft saved


draft discarded


























 


draft saved


draft discarded














StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fcodereview.stackexchange.com%2fquestions%2f186847%2fspiral-filling-an-existing-matrix-in-their-respective-positions-in-descending-or%23new-answer', 'question_page');

);

Post as a guest













































































HWteeXyCEFmvdUvKrVsPT zEDuUlUiAZNNrY0,oHnd5QbD y tGh3bxc5rhNb7OOX7
8dpIVUZ,V9i eD 5a6Q0px7 RV he63YPlmWlRWxOjn2AY4,5oguF,G4PXMFyqd0BX 9qb,tGRNPH,y

Popular posts from this blog

Chat program with C++ and SFML

Function to Return a JSON Like Objects Using VBA Collections and Arrays

Python - Quiz Game with Tkinter