题目地址:
首先来学习一个ac的代码:
作者
#include这个能ac ,但是思路有所欠缺,数据严格一些就会wa 因为只考虑了顺时针转,如果再转一次使min(k,n-1-2*i-k) 更小,然而temp值相等(不满足>) k就不会更新。#include #include #include #include #include #include #include #define INF 99999999using namespace std;const int MAX=10;int s[MAX][MAX];int main(){ int n; while(scanf("%d",&n),n){ for(int i=0;i temp){ temp=s[i+j][i]+s[n-1-i][i+j]+s[i][n-1-i-j]+s[n-1-i-j][n-1-i]; k=j; } } sum+=temp; num+=min(k,n-2*i-1-k); } cout<
但是sum算得是对的。
正确的方法是再处理一下逆时针转的结果 最后取较小值。
代码:
#include#include using namespace std;int a[10][10];int min(int a,int b){ return a >n) { if(n==0) break; for(int i=0;i max) { step1=n-1-2*i-j; max=cur; } } ans+=max; // max怎么旋转来算都行 max=-100000000; for(int j=0;j max) { max=cur; step2=j; } } step1=min(step1,n-1-2*i-step1); step2=min(step2,n-1-2*i-step2); steps+=min(step1,step2); } ans+=a[k][k]; cout< <<' '< <
这个暴力水题还是有点玄机的。
瑕疵是我一开始只做了逆时针旋转,总是wa找出来的
本题的另一个关键点是找出第i层的4个顶点的坐标 (有增量j时) 这个要结合几何性质就很明显了,第一个和第三个,是关于正方形中心中心对称的。