zoukankan      html  css  js  c++  java
  • 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;
    }
              
              
             
              
              
              
              
        
              
                
             
       



  • 相关阅读:
    拥有最多糖果的孩子
    求1+2+…+n
    网络-中间代理
    Header中的Referer属性表示
    ios13.4post请求出现网错错误 network err
    10.8&10.10
    9.23&9.27
    9.16&9.19
    校内模拟赛划水报告(9.9,9.11)
    男人八题 划水题解
  • 原文地址:https://www.cnblogs.com/csnd/p/12062920.html
Copyright © 2011-2022 走看看