螺旋矩阵取值

可以根据横纵坐标变化进行修改 x、y 的位置,也就是该改变矩阵起始位置,或者方向(顺时针、逆时针)

//n 矩阵边长
int getNum(int n,int x,int y)
{
    int r = 0;
    if(x<=y && x+y<=n+1) 
    {   
        r=x;
        return 4*(r-1)*n-4*(r-1)*(r-1)+1+y-r;
    }
    if(x<=y && x+y>=n+1) 
    {   
        r=n-y+1;
        return 4*(r-1)*n-4*(r-1)*(r-1)+1+n-2*r+1+x-r;
    }
    if(x>=y && x+y>=n+1)
    {   
        r=n-x+1;
        return 4*(r-1)*n-4*(r-1)*(r-1)+1+3*n-6*r+3-y+r;
    }
    if(x>=y && x+y<=n+1) 
    {   
        r=y;   
        return 4*(r-1)*n-4*(r-1)*(r-1)+1+4*n-8*r+4-x+r;
    }
    return 0;
}

注:下题代码暂时有误,请谨慎借鉴

例题:
The Preliminary Contest for ICPC Asia Nanjing 2019
The beautiful values of the palace

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
using namespace std;
#define ll unsigned long long
ll n;
struct node{
	ll x,y,num;
}use[100100];
ll getNum(ll x,ll y)
{
    ll r=0;
    if(x<=y && x+y<=n+1) 
    {   
        r=x;
        return 4*(r-1)*n-4*(r-1)*(r-1)+1+y-r;
    }
    if(x<=y && x+y>=n+1) 
    {   
        r=n-y+1;
        return 4*(r-1)*n-4*(r-1)*(r-1)+1+n-2*r+1+x-r;
    }
    if(x>=y && x+y>=n+1)
    {   
        r=n-x+1;
        return 4*(r-1)*n-4*(r-1)*(r-1)+1+3*n-6*r+3-y+r;
    }
    if(x>=y && x+y<=n+1) 
    {   
        r=y;   
        return 4*(r-1)*n-4*(r-1)*(r-1)+1+4*n-8*r+4-x+r;
    }
    return 0;
}
int main()
{
	ll t;
	cin>>t;
	while(t--)
	{
		ll m,p;
		scanf("%llu%llu%llu",&n,&m,&p);
		for(ll i=1;i<=m;i++)
		{
			ll x,y;
			scanf("%llu%llu",&x,&y);
			use[i].x=x,use[i].y=y;
			if(x<=n&&y<=n&&x>0&&y>0)
				use[i].num=getNum(n-x+1,n-y+1);
			else
				use[i].num=0;
		//	cout<<x<<" "<<y<<" "<<use[i].num<<endl;
		}
		for(ll i=1;i<=p;i++)
		{
			ll sum=0;
			ll x1,y1,x2,y2;
			scanf("%llu%llu%llu%llu",&x1,&y1,&x2,&y2);
			for(ll i=1;i<=m;i++)
			{
				if(use[i].x>=x1&&use[i].x<=x2&&use[i].y>=y1&&use[i].y<=y2)
				{
				//	cout<<use[i].num<<endl;
					sum+=use[i].num;
				}
			}
			printf("%llu\n",sum);
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值