输入一个奇数n,打印出一个n*n的矩阵,每个数字是从1到n*n的整数,要使每一行,每一列的数字之和都相等
2017-03-31 22:37
609 查看
#include<stdio.h>
int a[1000][1000];
int main()
{
int n,i,j;
scanf("%d",&n);
a[0][n/2]=1;
for(i=0;i>n;i++){
for(j=0;j<n;j++){
a[i][j]=0;
}
}
int h,l;
h=0;
l=n/2;
for(i=2;i<=n*n;i++){
if((h-1+n)%n>=0&&(l+1+n)%n>=0&&a[(h-1+n)%n][(l+1+n)%n]==0){
a[(h-1+n)%n][(l+1+n)%n]=i;
h=(h-1+n)%n;
l=(l+1+n)%n;
}
else if((h+1+n)%n>=0&&a[(h+1+n)%n][l]==0){
h=(h+1+n)%n;
a[h][l]=i;
}
else if((h+1+n)%n>=0&&(l+1+n)%n>=0&&a[(h+1+n)%n][(l+1+n)%n]==0)
{
h=(h-1+n)%n;
l=(l-1+n)%n;
a[h][l]=i;
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
要考虑三个方向,并且要按先后考虑
1:当前位置的斜上方
2:(若前一方向不行)当前方向的正下方
3:(若前一方向不行)当前方向的左上方
要注意的是虽然矩阵是n*n的,但是想的时候要把矩阵扩展,这就是(h-1+n)%n之类的原因
int a[1000][1000];
int main()
{
int n,i,j;
scanf("%d",&n);
a[0][n/2]=1;
for(i=0;i>n;i++){
for(j=0;j<n;j++){
a[i][j]=0;
}
}
int h,l;
h=0;
l=n/2;
for(i=2;i<=n*n;i++){
if((h-1+n)%n>=0&&(l+1+n)%n>=0&&a[(h-1+n)%n][(l+1+n)%n]==0){
a[(h-1+n)%n][(l+1+n)%n]=i;
h=(h-1+n)%n;
l=(l+1+n)%n;
}
else if((h+1+n)%n>=0&&a[(h+1+n)%n][l]==0){
h=(h+1+n)%n;
a[h][l]=i;
}
else if((h+1+n)%n>=0&&(l+1+n)%n>=0&&a[(h+1+n)%n][(l+1+n)%n]==0)
{
h=(h-1+n)%n;
l=(l-1+n)%n;
a[h][l]=i;
}
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}
要考虑三个方向,并且要按先后考虑
1:当前位置的斜上方
2:(若前一方向不行)当前方向的正下方
3:(若前一方向不行)当前方向的左上方
要注意的是虽然矩阵是n*n的,但是想的时候要把矩阵扩展,这就是(h-1+n)%n之类的原因
相关文章推荐
- 输入一个整数矩阵,计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素,就是第一行和最后一行的元素以及第一列和最后一列的元素。
- 输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所 有偶数位于数组的后半部分。要求时间复杂度为O(n)。
- 每天学习一算法系列(6) (输入一个整数和一棵二元树,从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径,打印出和与输入整数相等的所有路径)
- 给定一个整数,分别打印出每一位数字,然后每行都省略输出上一行的第一个数字
- 输入一个整数数组,实现一个函数来调整该数组中数字的顺序使得 所有奇数位于数组的前半部分,所有偶数位于数组后半部分
- 输入一个整数数组,调整数组中数字的顺序,使得所有的奇数位于数组的前半部分。
- 面试题:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
- <仅是自己做笔记。。。系列-4>输入一个整数和一棵二元树,从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径,打印出和与输入整数相等的所有路径
- 输入一个矩阵,按照从外到里以顺时针的顺序依次打印每一个数字
- 每天学习一算法系列(6) (输入一个整数和一棵二元树,从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径,打印出和与输入整数相等的所有路径)
- 给一个奇数 N(1<N<2000),把从 1 到 N 2 的整数排成一个 N 行 N 列的方阵,使 该方阵的每一行、列和对角线上的 N 个数的和都相等
- 输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。
- java-51-输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
- 输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分
- 从键盘输入一个整数(1~20) 则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。
- 输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于偶数前面
- 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数
- 算法习题54:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分
- 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请按成 一个函数,输入这样一个二维数组和一个整数,判断数组中是否含有该整数
- 有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n