题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4708
题目大意:给定一个方形矩阵,边长为3-10的奇数。每一圈的数字可以沿着顺时针方向和逆时针方向旋转,求使得矩阵主对角线和反对角线和最大时的数以及需要旋转的最小步骤。
Sample Input
5
9 3 2 5 9
7 4 7 5 4
6 9 3 9 3
5 2 8 7 2
9 9 4 1 9
0
Sample Output
72 1
分析:简单的模拟。分别计算每一圈旋转后的四个角的值最大需要的步骤(取顺时针、逆时针最小)。
但是我有理由相信这道题目有问题。因为矩阵是正方形,所以把原来的矩阵“躺下”,横竖坐标互换一下,即在输入时不是输入map[i][j] 而是 map[j][i],这样答案应该也是正确的,但是OJ却返回WA。因为这一点,最开始时计算每一圈四个角时的横竖坐标全都互换了,却半天不能AC,以至于怀疑连这么简单的题目都不会做,坑死。哪位大神有高见可以留言。
代码如下:
1 # include<iostream> 2 # include<cstdio> 3 # include<algorithm> 4 5 using namespace std; 6 7 int map[10][10]; 8 int main() 9 { 10 int n,sum,step,i,j; 11 while(scanf("%d",&n) && n) 12 { 13 for(i=0; i<n; i++) 14 for(j=0; j<n; j++) 15 scanf("%d",&map[i][j]); 16 int temp; 17 sum = step =0; 18 for(i=0; i<n/2; i++) 19 { 20 int tempsum = -9999999,tempstep = 0; 21 for(j=i; j<n-i-1; j++) 22 { 23 temp = map[j][i] + map[n-i-1][j] + map[i][n-j-1] + map[n-j-1][n-i-1]; 24 if(temp > tempsum) 25 { 26 tempsum = temp; 27 tempstep = min(j-i,n-i-j-1); 28 } 29 } 30 sum += tempsum; 31 step += tempstep; 32 } 33 printf("%d %d ",sum+map[n/2][n/2],step); 34 } 35 return 0; 36 }
大神就是大神,一下子看出了问题所在,下面是一位大虾点出来的
你少考虑了一种情况,或者说你那个AC的代码其实是错的。
1 if(temp > tempsum) 2 { 3 tempsum = temp; 4 tempstep = min(j-i,n-i-j-1); 5 } 6 else if (temp == tempsum) 7 { 8 tempstep = min(tempstep, min(j-i, n-i-j-1)); 9 }
果然是少考虑了,就算再做简单题也不能马虎了