【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 }