题解
2023-08-14 07:32:11
发布于:四川
12阅读
0回复
0点赞
看到题,我想到了NOIP2014普及组T3,交了个数学去,后面听说可以硬模拟,所以试了试模拟,还真过了。
模拟就是撞墙就变方向,很简单。
模拟代码:
#include <iostream>
#include <vector>
using namespace std;
int main(){
int n;
cin >> n;
vector<vector<int>> v(n,vector<int>(n,0));
int x=0,y=0;
int flag=4;//上下左右
for (int i=1;i<=n*n;++i){
v[x][y]=i;
if (flag==1){
--x;
}
if (flag==2){
++x;
}
if (flag==3){
--y;
}
if (flag==4){
++y;
}
if (flag==3 && (y<0 || v[x][y]!=0)){
flag=1;
++y;
--x;
}else if (flag==4 && (y>=n || v[x][y]!=0)){
flag=2;
--y;
++x;
}else if (flag==2 && (x>=n || v[x][y]!=0)){
flag=3;
--x;
--y;
}else if (flag==1 && (x<0 || v[x][y]!=0)){
flag=4;
++x;
++y;
}
}
int i,j;
cin >> i >> j;
cout<<v[i-1][j-1]<<endl;
return 0;
}
数学代码(挺玄学的,我都不知道我是怎么过的):
#include <iostream>
using namespace std;
int main(){
long long n,i,j,ans=0;
cin >> n >> i >> j;
long long mn=min(i,min(j,min(n-i+1,n-j+1)));
const int a=n<<2,b=mn<<2;
if (i<=j){
ans=mn*(a-4-b)+10*mn-a-3+i+j;
}else{
ans=mn*(a-b)+(b>>1)+1-i-j;
}
cout<<ans<<endl;
return 0;
}
这里空空如也
有帮助,赞一个