【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 @ 2019-02-19 08:29  AlphaInf  阅读(176)  评论(0编辑  收藏  举报