小说网 找小说 无限小说 烟雨红尘 幻想小说 酷文学 深夜书屋

基于visual Studio2013解决C语言竞赛题之1094纵横图







题目


解决代码及点评

/************************************************************************/
/* 二)程序设计
⑴奇阶纵横图n=2m+1请见填写方法分析1)。  该程序在 数组23题已经完成
⑵偶阶纵横图n=2(2m+1)时,算法分析是把方阵划成A、B、C、D四个小子阵,
  然后进行多次交换数字来完成,较麻烦,但可从中发现巧妙的规律,A、B、C、D子阵中各元素,
  都可以由 A子阵中相对位置上的元素加上一个常数得到,如B~(u/2)2,C~2(u/2)2D~3(u/2)2,
  只要按奇阶纵横图先填A子阵,而B、C、D子阵便可由A子阵演变而成。
⑶偶阶纵横图n=4m时,先用循环判断方阵中每一位置是否在对角线上,如在对角线上,则将该位置赋值为1,
  否则,赋值为0。然后将X←0,Y←N*N+1,X、Y为行列值。
  然后用二重循环(I,J)从1依次变化至n。若A[I][J]=1,则A[I][J]←Y,若A[I][J]=0, 则A[I][J]←X,循环结束即得n=4m的方阵。
                                         */
/************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void MF494(int arr[][8])
	{
	int num=8;
	int num1=num/4;
	
	int numB=num*num+1;
	for (int i=0;i<num;i++)
	{
		for (int j=0;j<num;j++)
		{
			if ((i+j)%4==3||abs(i-j)%4==0)
			{
				arr[i][j]=numB-i*num-j-1;
			}
			else
				arr[i][j]=i*num+j+1;
			printf("%3d",arr[i][j]);
		}
		printf("\n");
	}
}
//const int N=8;

void  MF5()
{	int k=2;
	int arr10[10][10]={0};
#pragma region W
	{int a[5][5] = {0};
	int num = 1;

	int i = 0;
	int j = 5/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 = 5 - 1;	//判断上一个是否在第0行
		else i--;
		if (cj == 5 - 1){		//判断上一个是否在第N-1列
			j = 0;
			i = ci-1;
		}
		else j++;
		if (a[i][j] != 0 || (ci == 0 && cj == 5 - 1)){		//判断下一个位置是否被占有,或上一个是否在第0行,第N-1列
			i = ci+1;
			j = cj;
		}

		int flag = 0;
		for (int u = 0; u < 5; u++){				//判断矩阵是否已满
			int flag1 = 0;
			for (int v = 0; v < 5; v++){
				if (a[u][v] == 0){
					flag1 = 1;
					break;
				}
			}
			if (flag1 == 1){						
				flag = 1;
				break;
			}
		}
		if (flag == 0)break;					//flag=0说明矩阵已经填满,跳出循环
	}
	for (int i=0;i<5;i++)
	{
		for(int j=0;j<5;j++)
		{
			arr10[i][j]=a[i][j];
		}
	}
	}
#pragma endregion W	
#pragma region W

	{int a[5][5] = {0};
	int num = 26;

	int i = 0;
	int j = 5/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 = 5 - 1;	//判断上一个是否在第0行
		else i--;
		if (cj == 5 - 1){		//判断上一个是否在第N-1列
			j = 0;
			i = ci-1;
		}
		else j++;
		if (a[i][j] != 0 || (ci == 0 && cj == 5 - 1)){		//判断下一个位置是否被占有,或上一个是否在第0行,第N-1列
			i = ci+1;
			j = cj;
		}

		int flag = 0;
		for (int u = 0; u < 5; u++){				//判断矩阵是否已满
			int flag1 = 0;
			for (int v = 0; v < 5; v++){
				if (a[u][v] == 0){
					flag1 = 1;
					break;
				}
			}
			if (flag1 == 1){						
				flag = 1;
				break;
			}
		}
		if (flag == 0)break;					//flag=0说明矩阵已经填满,跳出循环
	}
	for (int i=0;i<5;i++)
	{
		for(int j=0;j<5;j++)
		{
			arr10[i+5][j+5]=a[i][j];
		}
	}
	}
#pragma endregion 
#pragma region W

	{int a[5][5] = {0};
	int num = 51;

	int i = 0;
	int j = 5/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 = 5 - 1;	//判断上一个是否在第0行
		else i--;
		if (cj == 5 - 1){		//判断上一个是否在第N-1列
			j = 0;
			i = ci-1;
		}
		else j++;
		if (a[i][j] != 0 || (ci == 0 && cj == 5 - 1)){		//判断下一个位置是否被占有,或上一个是否在第0行,第N-1列
			i = ci+1;
			j = cj;
		}

		int flag = 0;
		for (int u = 0; u < 5; u++){				//判断矩阵是否已满
			int flag1 = 0;
			for (int v = 0; v < 5; v++){
				if (a[u][v] == 0){
					flag1 = 1;
					break;
				}
			}
			if (flag1 == 1){						
				flag = 1;
				break;
			}
		}
		if (flag == 0)break;					//flag=0说明矩阵已经填满,跳出循环
	}
	for (int i=0;i<5;i++)
	{
		for(int j=0;j<5;j++)
		{
			arr10[i][j+5]=a[i][j];
		}
	}
	}
#pragma endregion 
#pragma region W

	{int a[5][5] = {0};
	int num = 76;

	int i = 0;
	int j = 5/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 = 5 - 1;	//判断上一个是否在第0行
		else i--;
		if (cj == 5 - 1){		//判断上一个是否在第N-1列
			j = 0;
			i = ci-1;
		}
		else j++;
		if (a[i][j] != 0 || (ci == 0 && cj == 5 - 1)){		//判断下一个位置是否被占有,或上一个是否在第0行,第N-1列
			i = ci+1;
			j = cj;
		}

		int flag = 0;
		for (int u = 0; u < 5; u++){				//判断矩阵是否已满
			int flag1 = 0;
			for (int v = 0; v < 5; v++){
				if (a[u][v] == 0){
					flag1 = 1;
					break;
				}
			}
			if (flag1 == 1){						
				flag = 1;
				break;
			}
		}
		if (flag == 0)break;					//flag=0说明矩阵已经填满,跳出循环
	}
	for (int i=0;i<5;i++)
	{
		for(int j=0;j<5;j++)
		{
			arr10[i+5][j]=a[i][j];
		}
	}
	}
#pragma endregion 
	for (int i=0;i<5;i++)
	{
		for (int j=0;j<2;j++)
		{
			if (i==2)
			{
				int k=j+2;
				int temp=arr10[i][k];
				arr10[i][k]=arr10[i+5][k];
				arr10[i+5][k]=temp;
			}
			else
			{
				int temp=arr10[i][j];
				arr10[i][j]=arr10[i+5][j];
				arr10[i+5][j]=temp;
			}
			
		}
	}
	for (int j=0;j<5;j++)
	{
			int temp=	arr10[j][5+k];
			arr10[j][5+k]=arr10[j+5][5+k];
			arr10[j+5][5+k]=temp;
	}
	for (int i=0;i<10;i++)
	{
		for(int j=0;j<10;j++)
		{
			printf("%3d",arr10[i][j]);
		}
		printf("\n");
	}
}
void main()
{	
	
	printf(" 奇数的数组23题已经打印  这里打印  n=10  n=8  两种情况\n");
		MF5();
		printf("\n\n\n");
		int arr[8][8]={0};
		MF494(arr);
	system("pause");
}



代码编译以及运行

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

1)新建工程

2)选择工程

3)创建完工程如下图:

4)增加文件,右键点击项目

5)在弹出菜单里做以下选择

6)添加文件

7)拷贝代码与运行


程序运行结果


代码下载

http://download.csdn.net/detail/yincheng01/6681845

解压密码:c.itcast.cn







posted on 2013-12-10 15:26  牛栏山1  阅读(137)  评论(0编辑  收藏  举报

导航