hdu4772 水模拟
生活随笔
收集整理的這篇文章主要介紹了
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\n" ,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\n" ,ans);
? ?}
? ?return 0;
}
? ? ? ? ??
? ? ? ? ??
? ? ? ? ?
? ? ? ? ??
? ? ? ? ??
? ? ? ? ??
? ? ? ? ??
? ??
? ? ? ? ??
? ? ? ? ? ??
? ? ? ? ?
? ?
? ? ? 給你兩個矩陣,問你兩個矩陣的最大相同元素個數(位置也要求相同),矩陣可以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\n" ,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\n" ,ans);
? ?}
? ?return 0;
}
? ? ? ? ??
? ? ? ? ??
? ? ? ? ?
? ? ? ? ??
? ? ? ? ??
? ? ? ? ??
? ? ? ? ??
? ??
? ? ? ? ??
? ? ? ? ? ??
? ? ? ? ?
? ?
總結
以上是生活随笔為你收集整理的hdu4772 水模拟的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu4807枚举费用流
- 下一篇: hdu2100 26进制加法