NC238812. 草方块与牛排
描述
输入描述
输入共一行,为一个整数 ,含义见题面。
输出描述
输出可能有一行或者若干行。
如果不存在合法的铺排方式,则输出 。
否则第一行输出一个整数 表示要铺的“牛排”方块组的个数。
接下来 行,每行输出 个整数,表示一个“牛排”方块组中四个方块所在的位置的编号,其中第 行第 列的位置编号为 。
示例1
输入:
3
输出:
-1
说明:
示例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; }