列表

详情


NC238812. 草方块与牛排

描述

牛牛最近迷上了一款名为《牛的世界》的沙盒游戏。
在这款沙盒游戏里,有一个大小为 的初始平面,第 i 行第 j 列的位置编号为 。游戏者可以在其上放置一些方块,每一个方块占 的面积。由于这是牛世界新开发的沙盒游戏,难免有亿点简陋,所以游戏者可以放置的方块只有草方块和骨头。
为了给这个游戏增加一点趣味,牛牛决定增加一种名为“牛排”的方块组。
为了符合实际情况,“牛排”这个方块组的放置有一定的限制。

1. “牛排”方块组由四块骨头方块构成,为及其旋转、翻转可以得到的形状;
2. “牛排”方块组的四块骨头方块必须放置在同一高度上,且每一块骨头方块下恰好有一块草方块;
牛妹受邀为牛牛的方块组进行一些测试,于是她把整块 的初始平面的每一个位置上上都放置了一块草方块,但由于某些原因,她在左上角放置的 的草方块消失了
牛牛看到牛妹铺好的地图,决定用他新发明的“牛排”方块组将这 块草方块全部铺满,但他还要完善他的其他方块组,于是这个问题就交给了你。你需要告诉他一种铺排方式,或者告诉他这是不可能实现的。

输入描述

输入共一行,为一个整数  ,含义见题面。

输出描述

输出可能有一行或者若干行。
如果不存在合法的铺排方式,则输出 -1
否则第一行输出一个整数 m 表示要铺的“牛排”方块组的个数。
接下来 m 行,每行输出 4 个整数,表示一个“牛排”方块组中四个方块所在的位置的编号,其中第 i 行第 j 列的位置编号为

示例1

输入:

3

输出:

-1

说明:

白色的格子表示能放置“牛排”方块组的位置,一共有 5 块,但是一个“牛排”方块组占 4 个方块,一定不可能全部铺满。

示例2

输入:

6

输出:

8
3 16 9 15
32 33 27 31
22 21 20 26
4 5 10 6
11 18 12 24
28 34 36 35
17 30 23 29
13 14 19 25

说明:

输出构造的方案如图:

原站题解

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

C++(g++ 7.5.0) 解法, 执行用时: 82ms, 内存消耗: 7088K, 提交时间: 2022-10-02 19:37:33

#include<bits/stdc++.h>
using namespace std;
int n;
int get(int i,int j){return (i-1)*n+j;}
int main(){
    scanf("%d",&n);
    if((n*n-4)%8){puts("-1");return 0;}
    printf("%d\n",(n*n-4)/4);
    for(int i=3;i<=n;i+=4){
        printf("%d %d %d %d\n",get(1,i),get(2,i),get(2,i+1),get(2,i+2));
        printf("%d %d %d %d\n",get(1,i+1),get(1,i+2),get(1,i+3),get(2,i+3));
    }
    for(int i=3;i<=n;i+=4){
        for(int j=1;j<=n;j+=2){
            printf("%d %d %d %d\n",get(i,j),get(i+1,j),get(i+2,j),get(i,j+1));
            printf("%d %d %d %d\n",get(i+1,j+1),get(i+2,j+1),get(i+3,j+1),get(i+3,j));
        }
    }
}

C++(clang++ 11.0.1) 解法, 执行用时: 66ms, 内存消耗: 7004K, 提交时间: 2022-10-03 08:49:32

#include<bits/stdc++.h>
using namespace std;
int n;
int main()
{
	cin>>n;
	if((n-2)%4)
	{
		cout<<-1;
		return 0;
	}
	cout<<(n*n-4)/4<<endl;
	for(int k=3;k<=n;k+=4)
	{
		printf("%d %d %d %d\n",k,k+1,k+2,k+n);
		printf("%d %d %d %d\n",k+3,k+1+n,k+2+n,k+3+n);
	}
	for(int i=1;i<=n;i+=2)
		for(int k=3;k<=n;k+=4)
		{
			printf("%d %d %d %d\n",(k-1)*n+i,(k-1)*n+i+1,k*n+i,(k+1)*n+i);
			printf("%d %d %d %d\n",k*n+i+1,(k+1)*n+i+1,(k+2)*n+i+1,(k+2)*n+i);
		}
	return 0;
}

上一题