题解
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;
}
这里空空如也

有帮助,赞一个