zoukankan      html  css  js  c++  java
  • 打印螺旋数字矩阵

    1:如下,是一个“4×4”的数字矩阵,请找出其中的规律,然后编写一个程序,要求能打印出“N×N”时的数字矩阵:
     1     2      3    4
    12   13   14   5
    11   16   15   6
    10     9     8    7
    请用自己最熟悉的语言编写,或者用自然语言描述。至少要包括下列内容:
    1: 数字矩阵的规律
    2: 采用的数据结构
    3:关键的控制流程

     #include<iostream>
     #include<cmath>
     #define N 4
     using namespace std;
     int main()
     {
         int i,j;
         int count=0;
         int a[N][N];
         for(i=0;i<N/2;i++)
         {
             for(j=i;j<N-i-1;j++)
                 a[i][j]=++count;
             for(j=i;j<N-i-1;j++)
                 a[j][N-i-1]=++count;
             for(j=i;j<N-i-1;j++)
                 a[N-i-1][N-1-j]=++count;
             for(j=i;j<N-i-1;j++)
                 a[N-1-j][i]=++count;
         }
         if(N%2!=0)
             a[N/2][N/2]=++count;
         for(i=0;i<N;i++)
         {
             for(j=0;j<N;j++)
                 cout<<a[i][j]<<ends;
             cout<<endl;
         }
         return 0;
     }


    下面这个是自己写的

    #include<iostream>
    #include <map>
    const int N = 10;
    const int MaxMap = 100;
    using namespace std;
    
    enum
    {
       Right = 0,
       Dowm = 1,
       Left = 2,
       Up = 3
    };
    
    int GetValue(int x,int y)
    {
    	int nValue = x+y*MaxMap;
    	return nValue;
    }
    
    void Move(int Num,int &x,int &y)
    {
    	switch (Num%4) 
    	{
    	case Right: 
    		x++;
    		break;
    	case Dowm:
    		y++;
    		break;
    	case Left:
    		x--;
    		break;
    	case Up:
    		y--;
    		break;
    	}
    }
    
    void FillMap(map <int,int> &MapPonit)
    {
    	int Now_x=1,Now_y=1;    //当前坐标
    	int Next_x=1,Next_y =1; //下一步的坐标
    	int Num = 0;
    
    	for(int i=1;i<=N*N;i++)
    	{
    		// 转弯有二种情况,1.下一个点已经走过,2.一个方向上走到最大值N
    		if(((i-1)%(N-1)==0&&Num<3&&2<i))
    			Num++;
    		if(MapPonit.find(GetValue(Next_x,Next_y)) == MapPonit.end())
    		{
    			Now_x = Next_x;
    			Now_y = Next_y;
    		}
    		else
    		{	 
    			Num++;
    			Move(Num,Now_x,Now_y);
    			Next_x = Now_x;
    			Next_y = Now_y;
    		}
    		//根据value值保存所有走过的点
    		Move(Num,Next_x,Next_y);
    		MapPonit[GetValue(Now_x,Now_y)] = i;
    	}
    }
    
    void Print(map <int,int> MapPonit)
    {
    	map <int,int>::iterator itr = MapPonit.begin();
    	int NCout = 0;
    	for(itr;itr!=MapPonit.end();itr++)
    	{
    		if(NCout%N == 0)
    			cout<<endl;
    		int nStep = itr->second;
    		if(nStep<10)
    			cout<<0;
    		cout<<nStep<<" ";
    		NCout++;
    	}
    }
    
    int main()
    {
    	map <int,int> MapPonit;
    	FillMap(MapPonit);
    	Print(MapPonit);
    	getchar();
    	return 0;
    }

  • 相关阅读:
    SQL常见问题及解决备忘
    工厂方法模式-Factory Method
    访问者模式-Visitor
    解释器模式-Interpreter
    享元模式-Flyweight
    系统的重要文件/etc/inittab被删除了--急救办法!
    Database基础(二):MySQL索引创建与删除、 MySQL存储引擎的配置
    轻松解决U盘拷贝文件时提示文件过大问题
    Cisco基础(六):配置目前网络环境、项目阶段练习
    Cisco基础(五):配置静态NAT、配置端口映射、配置动态NAT、PAT配置、办公区Internet的访问
  • 原文地址:https://www.cnblogs.com/byfei/p/3112376.html
Copyright © 2011-2022 走看看