zoukankan      html  css  js  c++  java
  • 基于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	", arr[i][j]);
            }
            printf("
    ");
        }
    }
    
    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) << "	";
    	}
    	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) << "	";
    	}
    	cout << endl;
    	delete pInt;
    	return;
    }


  • 相关阅读:
    jeecg中移动tbody中的tr可实现位置交换
    SQL Server中的Datediff移植到Oracle计算有误解决方案
    Oracle如何插入日期数据
    在 Oracle 9i 中创建 方案
    手把手教你uniapp 打包的H5怎么实现谷歌登录
    网站和项目的区别
    基础知识
    全球唯一标识GUID
    MVC3 Razor视图引擎基础语法
    缓存技术
  • 原文地址:https://www.cnblogs.com/new0801/p/6177593.html
Copyright © 2011-2022 走看看