• 蛇形矩阵


    题目:

    现又一种蛇形矩阵,从第一行的行尾出发,顺时针移动,碰到边界或者自己的身体就转向,直至无法移动为止。请编写程序,得出答案。

    输入样例:

    8 6
    

    输出样例:

    20  21  22  23  24  1   
    19  38  39  40  25  2   
    18  37  48  41  26  3   
    17  36  47  42  27  4   
    16  35  46  43  28  5   
    15  34  45  44  29  6   
    14  33  32  31  30  7   
    13  12  11  10  9   8   
    

    代码示例:

    #include <iostream>
    #include <stdio.h>
    
    using namespace std;
    const int SIZE = 100;
    
    int main()
    {
    	int n, m;									// n:蛇形方阵的行; m:蛇形方阵的列.
    	cin >> m >> n;
    
    	int enumerateM = m, enumerateN = n;			// enumerateM:备份m的值; enumerateN:备份n的值.
    	int direction = 1, i = 0, j = n - 1;		// direction:用于判断方向; i:方阵数组的行; j:方阵数组的列.
    	int number = 1;								// number:储存在fArr里面的数值.
    
    	int fArr[SIZE][SIZE];						// fArr:用于储存蛇形方阵的数值数组.
    	for (i = 0; i < SIZE; i++)					// 数组初始化
    		for (j = 0; j < SIZE; j++)
    			fArr[i][j] = 0;
    
    	if (m == 1)
    	{
    		fArr[0][n - 1] = 1;
    	}
    	else
    	{
    		int a = -1, b = -1;							// 定义边界
    		i = -1; j = n; m += 1;
    	// 方向转向并赋值
    		int frequency = 0;
    		while (frequency < (enumerateM * enumerateN))
    		{
    			switch (direction % 4)
    			{
    			case 1:		// 方向向下,此时的特点是: 横坐标从0开始递增至m-1,纵坐标不变(为n-1)
    				{
    					m = m - 1;
    					i += 1; j -= 1;
    					while (i <= m - 1)
    					{
    						fArr[i][j] = number;
    						number++;
    						i++; frequency++;
    					} direction++;
    				} break;
    			case 2:		// 方向向左,此时的特点是: 横坐标不变(m-1),纵坐标从n-1递减至0
    				{
    					a += 1;
    					i -= 1;	j -= 1;
    					while (j >= a)
    					{
    						fArr[i][j] = number;
    						number++;
    						j--; frequency++;
    					} direction++;
    				} break;
    			case 3:		// 方向向上,此时的特点是: 横坐标从m-1开始递减至0,纵坐标不变(为0)
    				{
    					b += 1;
    					i -= 1; j += 1;
    					while (i >= b)
    					{
    						fArr[i][j] = number;
    						number++;
    						i--; frequency++;
    					} direction++;
    				} break;
    			case 0:		// 方向向右,此时的特点是: 横坐标不变(0),纵坐标从0递增至(m-1)-1
    				{
    					n = n - 1;
    					i += 1; j += 1;
    					while (j <= n - 1)
    					{
    						fArr[i][j] = number;
    						number++;
    						j++; frequency++;
    					} direction++;
    				} break;
    			}
    		}
    	}
    	// 输出数组
    	for (i = 0; i < enumerateM; i++)
    	{
    		for (j = 0; j < enumerateN; j++)
    			printf("%-4d", fArr[i][j]);
    		cout << endl;
    	}
    
    	return 0;
    }
  • 相关阅读:
    eclipse如何与git 配合工作。
    git托管代码(二)
    PPC2003 安装 CFNET 3.5成功
    我的Window Mobile WCF 項目 第三篇 WM窗体设计
    我的Window Mobile WCF 項目 第一篇Mobile开发和WinForm开发的区别
    我的Window Mobile WCF 項目 第七天
    我的Window Mobile WCF 項目 第二篇 WindowsMobile访问WCF
    WCF 用vs2010 和 vs2008的简单对比测试
    vs2010beta1 和 搜狗输入法 冲突,按下 Ctrl 键就报错,重装搜狗解决
    我的Window Mobile WCF 項目 第六天 (二)
  • 原文地址:https://www.cnblogs.com/JingWenxing/p/9945214.html
Copyright © 2020-2023  润新知