列表

详情


NC20896. 龙魂合一萨坎与晶石

描述

「文词只是浪费时间。 毁灭这语言人人都懂。」           ——萨坎沃

       萨坎重回乌金之眼,他发现乌金之眼正因之前的交战被开启。他思索着主人的目的,突然发现巨龙形态下的自己可以读懂晶石上的铭文。他变成巨龙,驱散了另一条堕落的龙魂,阅读了晶石上的神秘铭文。他具体读到了什么我们不得而知,我们只知道,阅读铭文后的萨坎只想切碎所有的晶石。
       浮在空中的晶石排列成了一个 n x n 的方格阵。每个单位边长的方格内有一颗晶石。萨坎能做的是选择两个不同的落在方格阵边界的交点,然后用剑沿着这两点连线割下去。如果一个方格被割断(只割到顶点或边界不算割断),那么这个方格内的晶石将失去能量。

i2UxsA.png

       如上图所示,这是一个 3 x 3 的方格阵。其中橙色部分表示被割断的方格;深红色线表示割下的路径。每个交点的坐标标记在其附近。
       经过交战,萨坎剩余的能量只够切割 n+1 次。由于种种原因,萨坎必须切恰好 n+1 刀,并且萨坎所切的 n+1 刀中,不能有任何两刀平行。有着丰富经验的萨坎在砍完 n+1 刀之后所有的晶石都失去了能量。
       现在请聪明的你也学着像萨坎那样,在这个 n x n 的方格中,切恰好 n+1 刀,使所有方格都能被割断。

输入描述

第一行一个正整数 T ,表示有 T 组测试数据。
接下去每组测试数据输入一行,包含一个正整数 n 。

输出描述

每个测试数据输出 n+1 行,每行四个整数 px, py, qx, qy ,表示一条由点 (px, py) 和点 (qx, qy) 连成的直线。点 (px, py) 和点 (qx, qy) 必须落在方格阵的边界上,且两点不能相同。
每行的四个整数之间请用一个空格隔开,行末请不要添加多余空格。文末请不要输出多余信息。

示例1

输入:

1
2

输出:

0 0 1 2
1 2 2 0
0 0 2 0

说明:

分割方案如下图所示。

原站题解

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

C++14(g++5.4) 解法, 执行用时: 14ms, 内存消耗: 984K, 提交时间: 2018-11-18 15:35:57

#include<bits/stdc++.h>
int main()
{
  int t;
  scanf("%d",&t);
  while(t--)
  {
    int n;
    scanf("%d",&n);
    if(n == 1){
        printf("0 0 1 1\n");
        printf("0 1 1 1\n");
        continue;
    }
    printf("0 %d %d %d\n",n,n,n-1);
    printf("%d %d %d 0\n",n-1,n,n);
    for(int i = 0;i < n-1; i+= 2){
    printf("%d %d %d %d\n",i,0,n,n-1-i);
    }
    for(int i = 1;i < n-1;i+= 2){
         printf("%d %d %d %d\n",0,i,n-1-i,n);
    }
  }
}

C++11(clang++ 3.9) 解法, 执行用时: 10ms, 内存消耗: 888K, 提交时间: 2020-08-07 12:19:09

#include<bits/stdc++.h>
using namespace std;

int main()
{
    int i,n,T;
    scanf("%d",&T);
    while(T--)
    {
    	scanf("%d",&n);
    	if(n==1){printf("0 0 1 1\n0 0 1 0\n");continue;}
    	for(i=0;i<n-1;i+=2)printf("%d %d %d %d\n",i,0,n,n-i-1);
    	for(i=1;i<n-1;i+=2)printf("%d %d %d %d\n",0,i,n-i-1,n);
    	printf("%d %d %d %d\n%d %d %d %d\n",0,n,n,n-1,n,0,n-1,n);
	}
    return 0;
}

上一题