hdu4772 水模拟

题意:
      给你两个矩阵,问你两个矩阵的最大相同元素个数(位置也要求相同),矩阵可以90旋转多次。

思路:
      水题,直接模拟就行了,方法很多,可以直接写坐标关系,或者一层一层处理,就是一层一层往里拿出来,比较就行了,两个都写了。


直接交换
#include<stdio.h>


int A[32][32] ,B[32][32] ,C[32][32];


void swap(int n)
{
   for(int i = 1 ;i <= n ;i ++)
   for(int j = 1 ;j <= n ;j ++)
   C[i][j] = A[j][n-i+1];
   for(int i = 1 ;i <= n ;i ++)
   for(int j = 1 ;j <= n ;j ++)
   A[i][j] = C[i][j];
}


int main ()
{
   int n ,i ,j ,ans;
   while(~scanf("%d" ,&n) && n)
   {
      for(i = 1 ;i <= n ;i ++)
      for(j = 1 ;j <= n ;j ++)
      scanf("%d" ,&A[i][j]);
      for(i = 1 ;i <= n ;i ++)
      for(j = 1 ;j <= n ;j ++)
      scanf("%d" ,&B[i][j]);
      int ans = 0;
      for(int c = 1 ;c <= 4 ;c ++)
      {
         int sum = 0;
         for(i = 1 ;i <= n ;i ++)
         for(j = 1 ;j <= n ;j ++)
         if(A[i][j] == B[i][j]) sum ++;
         if(ans < sum) ans = sum;
         swap(n);
      }
      printf("%d " ,ans);
   }
   return 0;
}


一层一层比较


#include<stdio.h>


int get_len(int c ,int n ,int A[32][32] ,int C[])
{
   int tmp = 0 ,i;
   for(i = c ;i <= n - c + 1 ;i ++)
   C[++tmp] = A[c][i];
   for(i = c + 1 ;i <= n - c + 1 ;i ++)
   C[++tmp] = A[i][n - c + 1];
   for(i = n - c + 1 - 1 ;i >= c ;i --)
   C[++tmp] = A[n - c + 1][i];
   for(i = n - c + 1 - 1 ;i >= c + 1 ;i --)
   C[++tmp] = A[i][c];
   return tmp;
}




int main ()
{
   int A[32][32] ,B[32][32] ,C[1000] ,D[1000];
   int i ,j ,n;
   int sum[5];
   while(~scanf("%d" ,&n) && n)
   {
      for(i = 1 ;i <= n ;i ++)
      for(j = 1 ;j <= n ;j ++)
      scanf("%d" ,&A[i][j]);
      for(i = 1 ;i <= n ;i ++)
      for(j = 1 ;j <= n ;j ++)
      scanf("%d" ,&B[i][j]);
      sum[1] = sum[2] = sum[3] = sum[4] = 0;
      for(int c = 1 ;c <= (n + 1) / 2 ;c ++)
      {
          int tmp1 = get_len(c ,n ,A ,C);
          int tmp2 = get_len(c ,n ,B ,D);
          for(i = 1 ;i <= 4 ;i ++)
          {
              for(j = 1 ;j <= tmp1 ;j ++)
              {
                 int now = j + (n - c + 1 - c) * (i - 1);
                 if(now > tmp1) now -= tmp1;
                 if(C[now] == D[j]) sum[i] ++;
              }           
         }
      }
      int ans = 0;
      for(i = 1 ;i <= 4 ;i ++)
      if(ans < sum[i]) ans = sum[i];
      printf("%d " ,ans);
   }
   return 0;
}
          
          
         
          
          
          
          
    
          
            
         
   



原文地址:https://www.cnblogs.com/csnd/p/12062919.html