基于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
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步