带有技巧的模拟(人家明明是数论题,被你这个蒟蒻做成了模拟好不好呀!!!)
好吧,原谅我蒟蒻
题目链接
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;
}

浙公网安备 33010602011771号