P2239 [NOIP2014 普及组] 螺旋矩阵 50分求助

P2239 [NOIP2014 普及组] 螺旋矩阵

我发现两个问题 A.为什么在输出的地方要加两个for(不过这不影响输出) B.这道题不能用暴力枚举,会超时。 可以把螺旋矩阵看成是由好几圈数字组成的,首先把 i,j 外面的圈的步数累加起来 | ■ | ■ | ■ | ■ | | -----------: | -----------: | -----------: | -----------: | | ■ | | | ■ | | ■ | | i,j | ■ | | ■ | ■ | ■ | ■ | 设len为一开始累加的圈数 然后看中间空白的方块,不妨设一个a值为现在矩阵的边长。此时 i,j 的位置就只有4种情况: * i 在第一行 : 此时只需要累加 j-a 即可 * j 在最后一行 此时需要累加 a+len-i+1 * i 在最后一行: 此时需要累加 a+y-len-1 * j 在第一行: 此时需要累加 3*a-2+n-len-i 最后输出累加的步数即可 附上代码 ```cpp #include<bits/stdc++.h> using namespace std; int n,a,x,y,ans,len; int main() { cin>>n>>x>>y; len=min(min(x-1,n-x),min(y-1,n-y)); a=n-2*len; ans=len*(n-len)*4; if(x==len+1) { ans+=y-len; } else if(y==a+len) { ans+=a+x-len-1; } else if(x==a+len) { ans+=a*3+len-y-1; } else { ans+=3*a-2+n-len-x; } cout<<ans; return 0; } ```
by Sundar_2022 @ 2022-07-26 15:18:33


本人蒟蒻一只,还是第一次写题解,如有错误之处还请见谅
by Sundar_2022 @ 2022-07-26 15:30:33


|