我发现两个问题
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