【xsy1097】 拼图 构造题

题目大意:请你使用n个图形拼成一个矩形。要求:①这每个图形都由1×1的小正方形组成,而且第i个图形由i个小正方形组成。②除了第1个和第2个图形以外,任意一个图形的所有小正方形,不都在一条直线上。

数据范围:n≤1000

 

当n为奇数时,我们这么构造:

 

当n为偶数时,我们n为奇数的基础上,在原矩阵下方加多两排n就好了。

 

复制代码
 1 #include<bits/stdc++.h>
 2 #define M 2005
 3 using namespace std;
 4 
 5 int a[M][M]={0};
 6 
 7 int main(){
 8     int n,m; scanf("%d",&n); m=(n+1)/2;
 9     int hh=0; if(n%2==0) hh=1,n--;
10     for(int i=1;i<=m;i++) a[n+1][i]=a[n+2][i]=n+1;
11     for(int x=n,i=1;x>m;x--,i++){
12         int nowx=i+1,nowy=i;
13         for(int j=1;j<=x;j++,nowx++){
14             if(a[nowx][nowy]) nowx--,nowy++;
15             a[nowx][nowy]=x;
16         }
17     }
18     for(int x=m,i=1;x>0;x--,i+=2){
19         int nowx=1,nowy=i;
20         for(int j=1;j<=x;j++,nowx++){
21             if(a[nowx][nowy]) nowx--,nowy++;
22             a[nowx][nowy]=x;
23         }
24         x--;
25         for(int j=1;j<=x;j++,nowx++){
26             if(a[nowx][nowy]) nowx--,nowy++;
27             a[nowx][nowy]=x;
28         }
29     }
30     printf("%d %d\n",n+(hh*2),m);
31     for(int i=1;i<=n+(hh*2);i++,printf("\n"))
32     for(int j=1;j<=m;j++) printf("%d ",a[i][j]);
33 }
复制代码

 

posted @   AlphaInf  阅读(178)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示