Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #define MAX_SIZE 10
- void ReadMatrix(int mat[MAX_SIZE][MAX_SIZE], int* size);
- int IsOrdered(int mat[MAX_SIZE][MAX_SIZE], int size, int index);
- void Step(int mat[MAX_SIZE][MAX_SIZE], int size, int layer);
- int OrderMat(int mat[MAX_SIZE][MAX_SIZE], int size, int* a);
- void PrintMat(int mat[MAX_SIZE][MAX_SIZE],int *size);
- int main()
- {
- int mat_size;
- int x , i , M = MAX_SIZE , a[5] = {0}, mat[MAX_SIZE][MAX_SIZE] , *size = &M;
- ReadMatrix(mat,size);
- x = OrderMat(mat,*size,a);
- mat_size=*size;
- PrintMat(mat,size);
- if(x==0)
- printf("CANNOT BE ORDERED\n");
- if(x==1)
- {
- printf("CAN BE ORDERED WITH THE FOLLOWING STEPS:\n");
- for(i=0 ; i<((*size/2)+*size%2); i++)
- printf("%d : %d\n",i+1,a[i]);
- }
- if(x==2)
- printf("ALREADY ORDERED\n");
- return 0;
- }
- //working correctly.
- void ReadMatrix(int mat[MAX_SIZE][MAX_SIZE], int* size)
- {
- int i,j ;
- int input;
- for ( i = 0 ; i < MAX_SIZE ; i++)
- {
- for ( j = 0 ; j < MAX_SIZE ; j++)
- {
- mat[i][j] = -1;
- }
- }
- scanf("%d", &input);
- *size = input;
- for ( i = 0 ; i < input ; i++)
- {
- for ( j = 0 ; j < input ; j++)
- {
- scanf("%d", &mat[i][j]);
- }
- }
- }
- int IsOrdered(int mat[MAX_SIZE][MAX_SIZE], int size, int index)
- {
- int i=0 , j=0;
- //moving over the first line in a layer num(index)
- for( j = index - 1 ; j < size - index + 1 ; j++)
- {
- if(mat[index-1][j] != (index-1)*size + j + 1 )
- return 0;
- }
- //moving over the last line in a layer(layer num = index).
- for( j = index - 1 ; j < size - index + 1 ; j++)
- {
- if(mat[size - index][j] != (size - index )*size + j + 1 )
- return 0;
- }
- //col.
- for( i = index - 1; i < size - index + 1 ; i++ )
- {
- if(mat[i][index-1] != i*size + index)
- return 0;
- }
- for( i = index - 1; i < size - index + 1 ; i++ )
- {
- if( mat[i][size - index] != i*size + size - index + 1)
- return 0;
- }
- return 1;
- }
- void Step(int mat[MAX_SIZE][MAX_SIZE], int size, int layer)
- {
- int Row,Col;
- int Angle1 = mat[layer-1][size-layer] , Angle2 = mat[size-layer][size-layer] , Angle3 = mat[size-layer][layer-1];
- if ( (size-layer)!=(layer-1) )
- {
- for(Col = size-layer; Col > layer-1; Col--)
- {
- mat[layer-1][Col] = mat[layer-1][Col-1];
- }
- for(Row = size-layer; Row > layer; Row--)
- {
- mat[Row][size-layer] = mat[Row-1][size-layer];
- mat[layer][size-layer] = Angle1;
- }
- for(Col = layer-1; Col < size-layer-1; Col++)
- {
- mat[size-layer][Col] = mat[size-layer][Col+1];
- mat[size-layer][size-layer-1] = Angle2;
- }
- for(Row = layer - 1; Row < size - layer; Row++)
- {
- mat[Row][layer-1] = mat[Row+1][layer-1];
- mat[size-layer-1][layer-1]=Angle3;
- }
- }
- }
- int OrderMat(int mat[MAX_SIZE][MAX_SIZE], int size, int* a)
- {
- int i=0,x, c = 0 ,L = 0;
- for(i=0 ; i <((size/2)+size%2); i++)
- {
- x = IsOrdered( mat, size, i+1);
- while(!x)
- {
- //printf("entered fucking here\n");
- c++;
- Step(mat, size, i+1);
- if(c>=40)
- return 0;
- x = IsOrdered( mat, size, i+1);
- }
- a[i] = c;
- if(c!=0)
- L++;
- c=0;
- }
- if (L !=(size/2)+(size % 2))
- return 1;
- return 2;
- }
- void PrintMat(int mat[MAX_SIZE][MAX_SIZE],int *size){
- //int row=*size, columns=*size;
- for (int row=0; row<*size; row++)
- {
- for(int columns=0; columns<*size; columns++)
- {
- printf("%d ", mat[row][columns]);
- }
- printf("\n");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement