zoukankan      html  css  js  c++  java
  • 一个类似于杨辉三角的数组算法思路

    前日邀月碰到一个问题。输入一个int32类型参数n,n>1。按如下的例子控制台输出:
    n=1:
    1  1
    1  1
    n=2:
    1  1  1
    1  2  1
    1  1  1
    n=3:
    1  1  1  1
    1  2  2  1
    1  2  2  1
    1  1  1  1
    n=4:
    1  1  1  1  1
    1  2  2  2  1
    1  2  3  2  1
    1  2  2  2  1

    1  1  1  1  1

    n=5:

    1  1  1  1  1  1
    1  2  2  2  2  1
    1  2  3  3  2  1
    1  2  3  3  2  1
    1  2  2  2  2  1
    1  1  1  1  1  1 

    n=6:

    1 1  1  1  1  1  1
    1  2  2  2  2  2  1
    1  2  3  3  3  2  1
    1  2  3  4  3  2  1
    1  2  3  3  3  2  1
    1  2  2  2  2  2  1
    1  1  1  1  1  1  1
    邀月征集几位网友的算法,整理如下:
    思路一:
    首先看例子,是一个2维矩阵,矩阵的范围是给定数+1,也就是给定5,那么范围就是6*6的矩阵。
    思路就是逐渐的+1,拿n=6,7*7的例子说明,首先矩阵里的所有单位+1,当全部加完的时候,
    第2轮是向内侧数一圈,也就是横纵坐标的最小值+1,而最大值-1;也就是定义的k跟c,
    最后当 k/2+1的时候就不再+1了,也就是6/2+1=4,5/2+1=3。

    邀月工作室

    邀月工作室

     算法示例一:

    public static void GetYangHuiArray2(int d)
            {
                
    int k = d;//最大值范围,
                int c = 0;//最小值范围
                int[,] a = new int[d + 1, d + 1];
                
    int aa = k / 2 + 1;
                
    for (int l = 0; l < aa; l++)
                {
                    
    for (int i = c; i <= k; i++)
                    {
                        
    for (int j = c; j <= k; j++)
                        {
                            a[i, j] 
    += 1;
                        }
                    }
                    k 
    -= 1;
                    c 
    += 1;
                }
                
    for (int i = 0; i <= d; i++)
                {
                    
    for (int j = 0; j <= d; j++)
                    {
                         Console.Write(a[i, j]);
                        Console.Write(
    '\t');
                    }
                    Console.WriteLine();
                }
            }

    思路二:
    第一步:规律
    1、打印行数列数均为:n+1
    2、打印数值,为位置到正方形的最近边距(4个边距中最小 的)。
    或者距离中心点越近的越大(取距离中心的距离,然后被n+1减一下。)
    第二步:抽象出算术逻辑
    i,j范 围:1-n
    到中心点的距离:左右|n+1-i| 上下|n+1-j|  
    值:n-最近的距离

    算法示例二:(清晰,易懂)

    public static void GetYangHuiArray4(int num)
            {
                
    for (int i = 0; i <= num; i++)
                {
                    
    for (int j = 0; j <= num; j++)
                    {
                        
    int min = i < j ? i : j;
                        
    int max = i > j ? i : j;
                        
    if (i + j < num)
                        {
                            Console.Write(min 
    + 1);
                            Console.Write(
    '\t');
                        }
                        
    else
                        {
                            Console.Write(num 
    - max + 1);
                            Console.Write(
    '\t');
                        }
                    }
                    Console.WriteLine();
                }

            }

    算法示例三:(更简洁)

    public static void GetYangHuiArray1(int num)
            {
                
    for (int i = 0; i < num + 1; i++)
                {
                    
    for (int j = 0; j < num + 1; j++)
                    {
                        Console.Write(
    "{0}\t", Math.Min(Math.Min(i + 1, num - i + 1), Math.Min(j + 1, num - j + 1)));
                    }
                    Console.WriteLine();
                }
            }

    算法示例四:(边计算边输出)

    public static void GetYangHuiArray5(int n)
            {
                System.Diagnostics.Debug.Assert(n 
    > 0);
                
    char space = '\t';
                Console.WriteLine(
    "n={0}", n);
                var l 
    = n + 1;
                var r 
    = l % 2;
                var h 
    = (l + r) / 2;
                
    for (int i = 1; i <= h; i++)
                {
                    StringBuilder line 
    = new StringBuilder();
                    
    for (int j = 1; j <= i; j++)
                    {
                        line.Append(j);
                        line.Append(space);
                    }
                    
    for (int j = l - 2 * i + r; j > 0; j--)
                    {
                        line.Append(i);
                        line.Append(space);
                    }
                    
    for (int j = i - r; j > 0; j--)
                    {
                        line.Append(j);
                        line.Append(space);
                    }
                    line.Remove(line.Length 
    - 11);
                    Console.WriteLine(line.ToString());
                }
                
    for (int i = h - r; i > 0; i--)
                {
                    StringBuilder line 
    = new StringBuilder();
                    
    for (int j = 1; j <= i; j++)
                    {
                        line.Append(j);
                        line.Append(space);
                    }
                    
    for (int j = l - 2 * i + r; j > 0; j--)
                    {
                        line.Append(i);
                        line.Append(space);
                    }
                    
    for (int j = i - r; j > 0; j--)
                    {
                        line.Append(j);
                        line.Append(space);
                    }
                    line.Remove(line.Length 
    - 11);
                    Console.WriteLine(line.ToString());
                }
            }

    算法示例五:(其他类似算法)

    public static void GetYangHuiArray3(int n)
            {
                
    for (int i = 1; i <= n; i++)
                {
                    
    for (int j = 1; j <= n; j++)
                    {
                        GetMin(i, j);
                    }
                    
    for (int j = n - 1; j >= 1; j--)
                    {
                        GetMin(i, j);
                    }
                    Console.WriteLine();
                }
                
    for (int i = n - 1; i >= 1; i--)
                {
                    
    for (int j = 1; j <= n; j++)
                    {
                        GetMin(i, j);
                    }
                    
    for (int j = n - 1; j >= 1; j--)
                    {
                        GetMin(i, j);
                    }
                    Console.WriteLine();
                }
            }
     public static void GetMin(int i, int j)
    {
    Console.Write(System.Math.Min(i, j));
    Console.Write('\t');
    }

    调用示例:

    public static void Main(string[] args)
            {
                Console.WriteLine(
    "input the rownum:");
                
    int input = int.Parse(Console.ReadLine());
                
    while (input > 0)
                {
                    Console.WriteLine(
    "n=" + input + ";");
                    GetYangHuiArray2(input);

                    input 
    = int.Parse(Console.ReadLine());
                }
            }

    效果:
    邀月工作室

    抛砖,期望有更多的思路分享。

  • 相关阅读:
    java+opencv实现图像灰度化
    java实现高斯平滑
    hdu 3415 单调队列
    POJ 3368 Frequent values 线段树区间合并
    UVA 11795 Mega Man's Mission 状态DP
    UVA 11552 Fewest Flops DP
    UVA 10534 Wavio Sequence DP LIS
    UVA 1424 uvalive 4256 Salesmen 简单DP
    UVA 1099 uvalive 4794 Sharing Chocolate 状态DP
    UVA 1169uvalive 3983 Robotruck 单调队列优化DP
  • 原文地址:https://www.cnblogs.com/downmoon/p/1771077.html
Copyright © 2011-2022 走看看