題意:給你一個n*n的矩陣,n為奇數,以最中心的一個數為基准,可以把這個矩陣 看成一圈一圈的,每一圈都可以逆時針或者順時針旋轉,每一次旋轉每個元素只能移動一個單元格,求經過每一圈的旋轉矩陣兩個對角線和最大的值,並求出最少旋轉次數
一圈一圈的處理,注意最中心的那個數不用管,就它一個,那麼這個矩陣只有n/2圈需要操作,對於每一圈的元素都放在一個一維數組裡面,然後枚舉這個數組裡的每一個元素為開頭,統計接下來的三個數,求和比較大小即可,因為有逆時針的,所以順時針時從開頭開始枚舉,逆時針則從尾部開始枚舉,這題數據貌似有些爛,
int n; int mp[15][15]; void init() { memset(mp,0,sizeof(mp)); } bool input() { while(cin>>n,n) { for(int i=0;i>mp[i][j]; return false; } return true; } void cal() { int ans = 0; int cnt = 0; int nnum = n/2; int aa[100 + 55]; for(int k=0;k k;j--)aa[pos++] = mp[n - k - 1][j]; for(int i=n - k - 1;i>k;i--)aa[pos++] = mp[i][k]; for(int i=0;i<=(pos + 1)/2;i++) { int tmp = 0; tmp = aa[i%pos] + aa[(i+(n-2*k-1))%pos] + aa[(i+2*(n-2*k-1))%pos] + aa[(i+3*(n-2*k-1))%pos]; if(tmp > sum) { sum = tmp; now = i; } if(tmp == sum) { if(i < now) now = i; } } for(int i=pos-1,mark = 0;mark <=(pos+1)/2;i--) { int tmp = 0; tmp = aa[i%pos] + aa[(i+(n-2*k-1))%pos] + aa[(i+2*(n-2*k-1))%pos] + aa[(i+3*(n-2*k-1))%pos]; if(tmp > sum) { sum = tmp; now = pos - i; } if(tmp == sum) { if(pos - i < now) now = pos - i; } mark++; } ans += sum; cnt += now; } ans += mp[n/2][n/2]; cout<