现在的位置: 首页 > 综合 > 正文

基于visual Studio2013解决C语言竞赛题之0523魔方阵

2013年02月03日 ⁄ 综合 ⁄ 共 982字 ⁄ 字号 评论关闭


题目

解决代码及点评


/*
功能:打印魔方阵。所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如:三阶魔方阵为
                        8  1  6	
                        3  5  7
                        4  9  2 
    要求打印由 1到 的自然数构成的魔方阵。
    提示:魔方阵中各数的排列规律如下:
      ⑴  将“1”放在第一行中间一列;
      ⑵  从“2”开始直到n×n为止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减1,列数加1;
      ⑶  如果上一个数的行数为1,则下一个数的行数为 n(指最下一行);
      ⑷  当一个数的列数为 n,下一个数的列数应为1,行数减1;
      ⑸  如果按上面规则确定的位置已有数,或上一个数是第 1行第 n列时, 则把下一个数放在上一个数的下面。

 
*/

#include<stdio.h>
#include<stdlib.h>

#define N 5				//N可以为任何奇数,因为偶数矩阵没有对角线,故不符合题意

void main(){
	int a[N][N] = {0};
	int num = 1;

	int i = 0;
	int j = N/2;

	int ci = 0;
	int cj = 0;


	while (1){
		a[i][j] = num++;        //将num当前数存入a[i][j];
		ci = i;					//保存i当前值;
		cj = j;					//保存j当前值;
		
		if (ci == 0)i = N - 1;	//判断上一个是否在第0行
		else i--;
		if (cj == N - 1){		//判断上一个是否在第N-1列
			j = 0;
			i = ci-1;
		}
		else j++;
		if (a[i][j] != 0 || (ci == 0 && cj == N - 1)){		//判断下一个位置是否被占有,或上一个是否在第0行,第N-1列
			i = ci+1;
			j = cj;
		}

		int flag = 0;
		for (int u = 0; u < N; u++){				//判断矩阵是否已满
			int flag1 = 0;
			for (int v = 0; v < N; v++){
				if (a[u][v] == 0){
					flag1 = 1;
					break;
				}
			}
			if (flag1 == 1){						
				flag = 1;
				break;
			}
		}
		if (flag == 0)break;					//flag=0说明矩阵已经填满,跳出循环
	}
	
	for (int u = 0; u < N; u++){				//打印矩阵
		for (int v = 0; v < N; v++){
			printf("%3d",a[u][v]);
		}
		printf("\n");
	}
	system("pause");
}

代码编译以及运行

由于资源上传太多,资源频道经常被锁定无法上传资源,同学们可以打开VS2013自己创建工程,步骤如下:

1)新建工程

抱歉!评论已关闭.