Advertisement
Guest User

Untitled

a guest
Jan 16th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.71 KB | None | 0 0
  1. #include <stdio.h>
  2. #define MAX_SIZE 10
  3.  
  4. void ReadMatrix(int[MAX_SIZE][MAX_SIZE], int*);
  5. int IsOrdered(int[MAX_SIZE][MAX_SIZE], int, int);
  6. void Step(int[MAX_SIZE][MAX_SIZE], int, int);
  7. int OrderMat(int[MAX_SIZE][MAX_SIZE], int, int*);
  8.  
  9. void ReadMatrix(int a[MAX_SIZE][MAX_SIZE], int* ActualSize)
  10. {
  11.     int i,j;
  12.     for(i=0;i<MAX_SIZE;i++)
  13.     {
  14.         for(j=0;j<MAX_SIZE;j++)
  15.         {
  16.             a[i][j] = -1;
  17.         }
  18.     }
  19.  
  20.     for(i=0;i<(*ActualSize);i++)
  21.     {
  22.         for(j=0;j<(*ActualSize);j++)
  23.         {
  24.             scanf("%d",&a[i][j]);
  25.         }
  26.     }
  27. }
  28.  
  29.  
  30. int IsOrdered(int a[MAX_SIZE][MAX_SIZE], int ActualSize, int Layer)
  31. {
  32.     int i,j,Counter=0;
  33.     for(j=Layer;j<=ActualSize-Layer;j++)
  34.     {
  35.         if((a[Layer-1][j] != (a[Layer-1][j-1] + 1)) || (a[ActualSize-Layer][j] != (a[ActualSize-Layer][j-1] + 1))) //ROWS
  36.         {
  37.             Counter = 1;
  38.             break;
  39.         }
  40.     }
  41.     for(i=Layer;i<=ActualSize-Layer;i++)
  42.     {
  43.         if((a[i][Layer-1] != (a[i-1][Layer-1] + ActualSize)) || ( a[i][ActualSize-Layer] != (a[i-1][ActualSize-Layer] + ActualSize))) //COLUMNS
  44.         {
  45.             Counter = 1;
  46.             break;
  47.         }
  48.     }
  49.     if(Counter==1)
  50.     {
  51.         return 0;
  52.     }
  53.     else
  54.     {
  55.         return 1;
  56.     }
  57. }
  58.  
  59. void Step(int a[MAX_SIZE][MAX_SIZE], int ActualSize, int Layer)
  60. {
  61.   int i,j;
  62.   int temp = a[Layer-1][Layer-1];
  63.   int LastLayer = (ActualSize/2) + 1;
  64.  
  65.   if(ActualSize%2!=0 && (Layer==LastLayer))
  66.   {
  67.   }
  68.   else
  69.   {
  70.     for(i=Layer-1;i<ActualSize-Layer;i++) //LEFT COLUMN
  71.   {
  72.       a[i][Layer-1] = a[i+1][Layer-1];
  73.   }
  74.  
  75.     for(j=Layer-1;j<ActualSize-Layer;j++) //BOTTOM ROW
  76.   {
  77.       a[ActualSize-Layer][j] = a[ActualSize-Layer][j+1];
  78.   }
  79.  
  80.     for(i=ActualSize-Layer;i>Layer-1;i--) // RIGHT COLUMN
  81.   {
  82.       a[i][ActualSize-Layer] = a[i-1][ActualSize-Layer];
  83.   }
  84.  
  85.     for(j=ActualSize-Layer;j>Layer;j--)   //TOP ROW
  86.   {
  87.       a[Layer-1][j] = a[Layer-1][j-1];
  88.   }
  89.  
  90.     a[Layer-1][Layer]=temp;
  91.   }
  92. }
  93.  
  94. int OrderMat(int a[MAX_SIZE][MAX_SIZE], int ActualSize, int* P)
  95. {
  96.     int i;
  97.     int LastLayer;
  98.     int OrderedLayers;
  99.     int UnOrdered;
  100.     if(ActualSize%2!=0)
  101.     {
  102.         LastLayer = (ActualSize/2) + 1;
  103.     }
  104.     else{LastLayer = ActualSize/2;}
  105.     OrderedLayers = LastLayer;
  106.  
  107.     for(i=1;i<=LastLayer;i++)
  108.     {
  109.         if(!(IsOrdered(a,ActualSize,i)))
  110.            {
  111.                /*printf("\nLayer Number %d isn't ordered\n",i);*/
  112.                OrderedLayers--;
  113.            }
  114.     }
  115.     if(OrderedLayers < LastLayer)
  116.     {
  117.         UnOrdered = 1;
  118.     }
  119.     else{return 2;}
  120.  
  121.     if(UnOrdered == 1)
  122.     {
  123.         for(i=0;i<LastLayer;i++)
  124.         {
  125.             P[i] = 0;
  126.             while(!(IsOrdered(a,ActualSize,i+1)))
  127.             {
  128.                 Step(a,ActualSize,i+1);
  129.                 P[i] = P[i] +1;
  130.                 if(P[i]>(ActualSize*ActualSize))
  131.                 {
  132.                     return 0;
  133.                 }
  134.             }
  135.         }
  136.         return 1;
  137.     }
  138. }
  139. int main()
  140. {
  141.     int a[MAX_SIZE][MAX_SIZE],P[MAX_SIZE];
  142.     int Dimension,i,j,LastLayer,Status;
  143.     scanf("%d",&Dimension);
  144.     ReadMatrix(a,&Dimension);
  145.     Status = OrderMat(a,Dimension,&P[0]);
  146.     switch(Status)
  147.     {
  148.         case 2:
  149.         printf("ALREADY ORDERED\n");
  150.         break;
  151.  
  152.         case 1:
  153.         printf("CAN BE ORDERED WITH THE FOLLOWING STEPS:\n");
  154.         if(Dimension%2!=0)
  155.         {
  156.             LastLayer = (Dimension/2) + 1;
  157.         }
  158.         else{LastLayer = Dimension/2;}
  159.         for(i=0;i<LastLayer;i++)
  160.         {
  161.             printf("%d : %d\n",i+1,P[i]);
  162.         }
  163.         break;
  164.  
  165.         case 0:
  166.         printf("CANNOT BE ORDERED\n");
  167.         break;
  168.     }
  169.     return 0;
  170. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement