带有技巧的模拟(人家明明是数论题,被你这个蒟蒻做成了模拟好不好呀!!!)

好吧,原谅我蒟蒻

题目链接

50分就是暴力建矩阵。但由于数据过大,不能拿全分

100分: 由于数据的限制,不能用二维数组。只好利用数学方法。

由于本人十分蒟蒻,只推出来了对于每一个小矩形,右上角的数字和他外面的矩形的关系

小矩形右上角的数字=(小矩形的边长-1)*4+外面的矩形的右上角的数字

//真的好暴力呀
#include<iostream>
#include<cstdio>
using namespace std;
int n,x,y;
void out(int begin,int now)
{
	int nx=now,ny=now;
	if(nx==x&&ny==y)
	{
		printf("%d",begin);
		return ;
	}
	while(1)
	{
		while(ny<n-now+1)
		{	
			begin++;ny++;
			if(nx==x&&ny==y)
			{
				printf("%d",begin);
				return ;
			}
		}
		while(nx<n-now+1)
		{	
			begin++;nx++;
			if(nx==x&&ny==y)
			{
				printf("%d",begin);
				return ;
			}
		}
		while(ny>now)
		{	
			begin++;ny--;
			if(nx==x&&ny==y)
			{
				printf("%d",begin);
				return ;
			}
		}
		while(nx>now)
		{
			begin++;nx--;
			if(nx==x&&ny==y)
			{
				printf("%d",begin);
				return ;
			}
		}
	}
}
int main()
{
	scanf("%d%d%d",&n,&x,&y);
	int m=n/2;
	if(n%2)
		m++;
	int begin=1;
	for(int i=1;i<=m;i++)//枚举第几个圈,第i个圈的边长=n-i*2(最外面的圈为第0圈)
	{
		if(x==i||x==n-i+1||y==i||y==n-i+1)
		{
			out(begin,i);
			break;
		}
		begin+=(n-2*i+1)*4;//由于是退出下一个矩形的右上角,而当前的i是当前是第几个圈所以begin+(n-2*(i-1)-1)*4=begin+(n-2*i+1)了
	}
	return 0;
}
posted @ 2018-03-05 09:54  Lance1ot  阅读(89)  评论(0)    收藏  举报