基于Visual C++2013拆解世界五百强面试题--题3-打印螺旋数组
请用C语言实现 输入N,打印N*N矩阵
比如 N = 3, 打印:
1 2 3
8 9 4
7 6 5
N = 4, 打印
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
启动2012
输出结果
#include <stdio.h>
#include <stdlib.h> #define M 5
int arr[M][M] = { 0 }; //初始化数组全0 ,用0来判断数组是否赋有正确的值 void HuiJu(void); //矩阵赋值函数
void ShowArr(void); //输出矩阵 int main()
{
HuiJu();
ShowArr(); system("pause");
return 0;
} void ShowArr(void)
{
int i = 0;
int j = 0;
for (i = 0; i < M; i++)
{
for (j = 0; j < M; j++)
{
printf("%d\t", arr[i][j]);
}
printf("\n");
}
} void HuiJu(void)
{
int i = 0; //数组索引
int j = 0; //数组索引
int direc = 1; //方向控制
int num = 1; //给数组进行赋值的变量 while (num <= M*M)//对矩阵循环赋值
{
switch (direc)
{
case 1: //从左到右
while (arr[i][j] == 0 && j < M) //数组值为0以及索引j没有越界时进行
{
arr[i][j] = num;
num++;
j++; //i不变 j递增
}
j--; //改变索引为下一个变量的索引
i++; //改变索引为下一个变量的索引
direc = 2;//把方向从左到右改变为从上到下
break; case 2: //从上到下
while (arr[i][j] == 0 && i < M)//数组值为0以及索引i没有越界时进行
{
arr[i][j] = num;
num++;
i++; //j不变 i递增
}
i--; //改变索引为下一个变量的索引
j--; //改变索引为下一个变量的索引
direc = 3;//把方向从上到下改变为从右到左
break; case 3: //从右到左
while (arr[i][j] == 0 && j >= 0)//数组值为0以及索引j没有越界时进行
{
arr[i][j] = num;
num++;
j--; //i不变 j递减
}
j++; //改变索引为下一个变量的索引
i--; //改变索引为下一个变量的索引
direc = 4;//把方向从右到左改变为从上到上
break; case 4: //从下到上
while (arr[i][j] == 0) //从下到上只需要判断是否被正确赋值
{
arr[i][j] = num;
i--; //j不变 i递减
num++;
}
i++; //改变索引为下一个变量的索引
j++; //改变索引为下一个变量的索引
direc = 1; //把方向从下到上改变为从左到右
break;
}
}
}
源代码下载地址如下:
http://download.csdn.net/detail/yincheng01/6369295
网友评论中提出了递归的解决方法,认为还不错,下面我贴出他的解法和我的一种解法,大家有更好的解法也可以发到评论里.
网友的解法:
#include <iostream>
using namespace std; int* sort(int n)
{
if (n < 1)
return NULL;
if (n == 1)
{
int *p = new int[1];
*p = 1;
return p;
}
else if (n == 2)
{
int *p = new int[4];
*p = 1;
*(p + 1) = 2;
*(p + 2) = 4;
*(p + 3) = 3;
return p;
}
else
{
int * iResult = new int[n*n];
int * iLast;
int i, j;
iLast = sort(n - 2);
for (i = 0; i < n - 1; i++)
*(iResult + i) = i + 1;
for (i = 0; i < n - 2; i++)
{
*(iResult + (i + 1)*n - 1) = n + i;
*(iResult + (i + 1)*n) = 4 * n - 4 - i;
for (j = 0; j < n - 2; j++)
{
*(iResult + (i + 1)*n + j + 1) = *(iLast + i*(n - 2) + j) + 4 * n - 4;
}
}
delete iLast;
*(iResult + n*(n - 1) - 1) = 2 * n - 2;
for (i = 0; i < n; i++)
*(iResult + n*(n - 1) + i) = 3 * n - 2 - i;
return iResult;
}
return NULL;
}
void main()
{
int i, n = 0;
while (n < 1)
{
printf("Please input a number which is bigger than 0:");
scanf("%d", &n);
}
int *pInt = sort(n);
for (i = 0; i < n*n; i++)
{
if (i%n == 0)
cout << endl;
cout << *(pInt + i) << "\t";
}
cout << endl;
delete pInt;
return;
}
当然解决的方法是非常多的,第一种方法是最好想到的,下面我贴出我的另一种方法供网友们参考。
#include <iostream>
using namespace std; int* sort(int n)
{
int *p = new int[n*n];
*(p + (n / 2)*n + (n / 2)) = n*n;
int start = 1;
for (int i = 0; i < n / 2; i++)
{
for (int j = i; j < n - i - 1; j++)
{
*(p + i * n + j) = start;
*(p + j * n + n - i - 1) = start + n - 2 * i - 1;
*(p + (n - 1 - i)*n + n - j - 1) = start + 2 * (n - 1 - 2 * i);
*(p + (n - 1 - j)*n + i) = start++ + 3 * (n - 1 - 2 * i);
}
start += 3 * (n - 1 - 2 * i);
}
return p;
} void main()
{
int i, n = 0;
while (n < 1)
{
printf("Please input a number which is bigger than 0:");
scanf("%d", &n);
}
int *pInt = sort(n);
for (i = 0; i < n*n; i++)
{
if (i%n == 0)
cout << endl;
cout << *(pInt + i) << "\t";
}
cout << endl;
delete pInt;
return;
}
基于Visual C++2013拆解世界五百强面试题--题3-打印螺旋数组的更多相关文章
- 基于Visual C++2013拆解世界五百强面试题--题2-输出和为一个给定整数的所有组合
请用C语言实现 输出和为一个给定整数的所有组合 启动2012 /* 请用C语言实现 输出和为一个给定整数的所有组合 */ #include <stdio.h> //包含头文件stdio.h ...
- 基于Visual C++2013拆解世界五百强面试题--题1-定义各种类型指针
用变量a给出下面的定义 a)一个整型数 b)一个指向整型数的指针 c)一个指向指针的指针,它指向的指针是指向一个整型数 d)一个有10个整型数的数组 e)一个有10个指针 ...
- 基于Visual C++2013拆解世界五百强面试题--题18-程序结果分析2-终结篇
第二部分程序结果分析,分析流程还是写入代码注释中 分析下面程序的输出: #include <stdio.h> int main() { char *a = "hello" ...
- 基于Visual C++2013拆解世界五百强面试题--题17-程序结果分析1
分析程序结果,分析过程我们就写在程序注释里面. 写出下列代码的输出内容 #include <stdio.h> int inc(int a) { return (++a); } int mu ...
- 基于Visual C++2013拆解世界五百强面试题--题16-进制分析
清写出下列代码的输出内容 #include <stdio.h> int main() { int a = -1, b = -12, c = -123, d = -1234; printf( ...
- 基于Visual C++2013拆解世界五百强面试题--题15-递归相加
有一分数序列: 1/2 , 1/4 , 1/6 , 1/8 ......,用递归的方法,求此数列20项之和. 可以看出规律:每一项位1/n*2 这个很容易些递归,但是要注意一点,使用浮点数相除保存: ...
- 基于Visual C++2013拆解世界五百强面试题--题14-循环删除
有一个数组a[1000]存放0-1000,要求每隔二个数删除一个数,到末尾时循环到开头继续进行,求最后一个被删掉数的原始下标. 看到题目可以用循环链表保存这些数,然后循环删除,大大减少了一些复杂的边界 ...
- 基于Visual C++2013拆解世界五百强面试题--题13-找最大公共子字符串
编程实现:找出两个字符串中最大公共子字符串,如"abccade"和"dgcadde"的最大子字符串为"cad". 如果不考虑效率的话直接比较 ...
- 基于Visual C++2013拆解世界五百强面试题--题12-进制转换
编程实现,把十进制数(long型)分别以二进制和十六进制形式输出,不能使用printf系列库函数. 转换成二进制,直接循环移位依次取每一位,判断1或0然后将相应字符放入字符串缓冲区中. 对于十六进制, ...
随机推荐
- 创建以及加载模块【nodejs第四篇】
建立两个文件,文件一createModule.js ,文件二main.js createModule.js的代码,主要用于创建一个模块 /** * Created by Administrator o ...
- <a>元素生成多个<a>的问题,元素标签结尾影响
告诉我不是真的吧,<a/>和<a></a>真的有区别...
- 我用过的Linux命令之chmod
chmod命令用于改变linux系统文件或目录的访问权限.用它控制文件或目录的访问权限.该命令有两种用法.一种是包含字母和操作符表达式的文字设定法:另一种是包含数字的数字设定法. Linux系统中的每 ...
- GridView分页功能的实现
当GridView中显示的记录很多的时候,可以通过GridView的分页功能来分页显示这些记录.如果GridView是直接绑定数据库,则很简单:将"启动分页"打勾即可. 如果是用代 ...
- C语言迭代求解
date : 2013/8/12 desinger :pengxiaoen 今天看 国外电子信息科学经典教材系列 <电子电路分析与设计> 电子工业出版社的 的19 ...
- Asp.Net Core WebApi学习笔记(四)-- Middleware
Asp.Net Core WebApi学习笔记(四)-- Middleware 本文记录了Asp.Net管道模型和Asp.Net Core的Middleware模型的对比,并在上一篇的基础上增加Mid ...
- MySQL 数据显示宽度
例子: 把int 的显示宽度设置为 3 create table t(x int(3) zerofill); insert into t(x) values(1); select x from t; ...
- Snort
https://www.snort.org/ http://blog.csdn.net/htttw/article/details/7521053 http://www.ibm.com/develop ...
- Windows-1252对Latin1编码有改变(并不完全兼容),而且Latin1缺失了好多西欧字符(法语,德语,西班牙语都有)
主要是80到9F的编码被改掉了.从latin1的控制字符,变成了可以输出的可见字符. latin1编码: ISO-8859-1 x0 x1 x2 x3 x4 x5 x6 x7 x8 x9 xA x ...
- cocos2dx 在mac下开发ios和android游戏
这里主要说android,因为ios开发在文章 http://blog.csdn.net/itcastcpp/article/details/24792323 中已经说过. 1)打开工程 打开ecli ...