题目链接:点击打开链接
据说这是组合数学中的一道例题。
题目意思很简单,一开始,没看出来,什么意思。以为是一道找规律题。
其实就是一模拟题,从1---n^2,一直向右上方填数就好。
两个问题:
1.越界问题。
2.已填数这么办?填入该填数的前一个的下方。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
const int N=22;
int map[N][N];
int main(){
int T;
scanf("%d",&T);
while(T--){
memset(map,0,sizeof(map));
int n;
scanf("%d",&n);
int i=1,j=(n+1)/2,k=1;
map[i][j]=k++;
while(k<=n*n){
//first out of the map;
i=i-1;j=j+1;
if(i<=0) i=n;
if(j>n) j=1;
//second is filled
if(map[i][j]!=0) {
i=i+2;
j=j-1;
}
if(i>n) i=i-n;
if(j<=0) j=n;
map[i][j]=k++;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
printf("%4d",map[i][j]);
printf("\n");
}
}
return 0;
}
这是组合数学中的一道例题,我想,应该系统的学习一下一些知识。不能盲目的走了。恩。