列表

详情


NC210773. 巨阵

描述

题面
现有一个 n *n 的方阵需要不重复地填上 ~ 这些数
现在我们定义一些四元格是“巨” 的,当且仅当该四元格大小为 2 *2 且这四个格子中的数字从其中某个位置开始顺时针递增
而你需要输出一个这样的 n *n 的方阵最多有多少个巨格,并且将其构造出来


输入描述

一个数 n ()

输出描述

第一行一个数表示最大巨格数

接下来 n 行输出大小为 n*n 的方阵

示例1

输入:

3

输出:

3
9 2 3
8 5 4
7 6 1

说明:

解释:易得左上、左下、右上 三个四元格是巨格

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++11(clang++ 3.9) 解法, 执行用时: 82ms, 内存消耗: 17536K, 提交时间: 2020-10-18 08:13:44

#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll a[2000][1500];
int main()
{
	ll i,j,k,l,n,m,t;
	cin>>n;
	ll ans=(n-1)+n/2*(n-2);
	if(n%2==1)
	{
		ans+=(n-2)/2;
	}
	ll cnt;
	for(i=1;i<=n;i++)
	{
		a[1][i]=i;
	}
	cnt=n;
	for(i=n;i>=1;i--)
	{
		if((n-i)%2==0)
		{
			for(j=2;j<=n;j++) 
			{
				cnt++;
				a[j][i]=cnt;
			}
		}
		else
		{
			for(j=n;j>=2;j--) 
			{
				cnt++;
				a[j][i]=cnt;
			}
		}
	}
	if(n>=3&&n%2==1)
	{
		cnt=n*n;
		for(j=2;j<=n;j++)
		{
			if(j%2==0) 
			{
				a[j][1]=cnt;
				a[j][2]=cnt-1;
			}
			else
			{
				a[j][1]=cnt-1;
				a[j][2]=cnt;
			}
			cnt-=2;
		}
	}
	printf("%lld\n",ans);
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=n;j++)
		{
			printf("%lld" ,a[i][j]);
			if(j==n) printf("\n");
			else printf(" ");
		}
	}
}

上一题