首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

【代码最简化】打印一个“回”字图形,看哪位高手写的代码最少

2012-01-05 
【代码最简化】打印一个“回”字图形,看谁写的代码最少。需求按顺序输出从1到9个环的“回”字图形,参见输出。这个

【代码最简化】打印一个“回”字图形,看谁写的代码最少。

需求按顺序输出从1到9个环的“回”字图形,参见输出。这个输出是固定不变的,就看谁用最少的代码实现。

注:系统标识符和自定义标识符都只计为一个字符。即:“int”和“System.Int32”都只算一个字符。
可以引用任何一个.NET自带的程序库,但不允许使用第三方控件和程序库。建议使用VS2005和VS2008环境。

输出1
-------
222
212
222
-------
33333
32223
32123
32223
33333
-------
4444444
4333334
4322234
4321234
4322234
4333334
4444444
-------
555555555
544444445
543333345
543222345
543212345
543222345
543333345
544444445
555555555
-------
66666666666
65555555556
65444444456
65433333456
65432223456
65432123456
65432223456
65433333456
65444444456
65555555556
66666666666
-------
7777777777777
7666666666667
7655555555567
7654444444567
7654333334567
7654322234567
7654321234567
7654322234567
7654333334567
7654444444567
7655555555567
7666666666667
7777777777777
-------
888888888888888
877777777777778
876666666666678
876555555555678
876544444445678
876543333345678
876543222345678
876543212345678
876543222345678
876543333345678
876544444445678
876555555555678
876666666666678
877777777777778
888888888888888
-------
99999999999999999
98888888888888889
98777777777777789
98766666666666789
98765555555556789
98765444444456789
98765433333456789
98765432223456789
98765432123456789
98765432223456789
98765433333456789
98765444444456789
98765555555556789
98766666666666789
98777777777777789
98888888888888889
99999999999999999
-------


调试代码:
C# code
private void PrintBox(){     // TODO : 自由发挥}private void button1_Click(object sender, EventArgs e){    PrintBox();  }


[解决办法]
先把数字放入数组然后打印数组。
只说说想法吧。
[解决办法]
潜力贴先留名
[解决办法]
其实应该比逻辑,而不是比谁的代码少。

C# code
class Program{    static Dictionary<string, int> buff;    static void Main(string[] args)    {        do        {            Console.Write("输入一个整数...");            int x = int.Parse(Console.ReadLine());            buff = new Dictionary<string, int>();            int y = think(x, 1);            print(y);        } while (true);    }    static void print(int 行数)    {        for (int i = 1; i <= 行数; i++)        {            for (int h = 1; h <= 行数; h++)                Console.Write(buff[i.ToString() + "," + h.ToString()]);            Console.WriteLine();        }    }    static int think(int x, int 开始行)    {        if (x == 1)        {            buff.Add(开始行.ToString() + "," + 开始行.ToString(), 1);            return 开始行;        }        else        {            int e = think(x - 1, 开始行 + 1);            for (int i = 开始行; i <= e + 1; i++)            {                buff.Add(开始行.ToString() + "," + i.ToString(), x);                buff.Add((e + 1).ToString() + "," + i.ToString(), x);            }            for (int i = 开始行 + 1; i <= e; i++)            {                buff.Add(i.ToString() + "," + 开始行.ToString(), x);                buff.Add(i.ToString() + "," + (e + 1).ToString(), x);            }            return e + 1;        }    }}
[解决办法]
先顶下
学习

[解决办法]
潜力贴,MARK
[解决办法]
不知道楼主想干什么
[解决办法]
收藏先
[解决办法]

C# code
class Program    {        static void Main(string[] args)        {            print();            Console.Read();        }        private static void print()        {                        for( int i=0 ; i<9;i++)            {                for (int j = 0; j < 2 * i + 1; j++)                {                    for (int k = 0; k < 2 * i + 1; k++ )                    {                        int tempj, tempk;                        if (j < i)                            tempj = i - j ;                        else                            tempj = j - i;                        if (k < i)                            tempk = i - k ;                        else                            tempk = k - i;                        Console.Write(tempj > tempk ? tempj+1 : tempk+1);                        Console.Write(" ");                    }                    Console.Write("\r\n");                }                Console.WriteLine("---------------------------------");            }        }    }
[解决办法]
C# code
class Program{    static void Main(string[] args)    {        PrintBox(9);    }    static void PrintBox(int n)    {        int[,] a = CreatArray(n);        for (int i = 0; i < 2 * n - 1; i++)        {            for (int j = 0; j < 2 * n - 1; j++)            {                Console.Write(a[i,j]);            }            Console.WriteLine();        }    }    static int[,] CreatArray(int n)    {        int d = 2 * n - 1;        int[,] a = new int[d, d];        if (n == 1)        {            a[0, 0] = 1;            return a;        }        int[,] t = CreatArray(n - 1);        for(int i = 0;i < d;i++)            for (int j = 0; j < d; j++)            {                if (i > 0 && i < d - 1 && j > 0 && j < d - 1)                    a[i, j] = t[i-1, j-1];                else                    a[i, j] = n;            }        return a;    }}
[解决办法]
C# code
private void PrintBox(){     // TODO : 自由发挥            for (int k = 1; k <= 9; k++)            {                for (int i = 0; i <= 2 * k - 2; i++)                {                    for (int j = 0; j <= k * 2 - 2; j++)                    {                        Console.Write(Convert.ToString(Math.Abs(k - 1 - ((Math.Abs(k - i - 1) >= Math.Abs(k - j - 1)) ? i : j)) + 1));                    }                    Console.WriteLine();                }                Console.WriteLine("-------");            }}private void button1_Click(object sender, EventArgs e){    PrintBox();  }
[解决办法]
C# code
using System;using System.Text;using System.Windows.Forms;using System.Collections.Generic;class Hui{    static void printbox(int n)    {        int cntLine = 2*n-1;        int halfLine = cntLine/2;        Func<int,string> getLine =(cl)=>        {            var strLeft = new StringBuilder();            var strRight = new StringBuilder();            int ccolum = -1;            for (int i =0;i<halfLine;++i) {                int curNum = n-(ccolum==cl?ccolum:++ccolum);                strLeft.Append(curNum);                strRight.Insert (0,curNum);            }            strLeft.AppendFormat ("{0}{1}",n - cl,strRight);            return strLeft.ToString();        };        for (int i = 0;i<cntLine;++i)        {            Console.WriteLine (getLine(i>halfLine?cntLine-i-1:i));        }    }    static void Main ()    {        for (int i=1;i<10;++i) {            printbox (i);            Console.WriteLine ("----------------------------------------");        }    }} 


[解决办法]
略微化减一点点

C# code
private void PrintBox(){            for (int k = 1; k <= 9; k++)            {                for (int i = 1; i < k * 2; i++)                {                    for (int j = 1; j < k * 2; j++)                    {                        Console.Write(Convert.ToString(Math.Abs(k - ((Math.Abs(k - i) >= Math.Abs(k - j)) ? i : j)) + 1));                    }                    Console.WriteLine();                }                Console.WriteLine("-------");            }}private void button1_Click(object sender, EventArgs e){    PrintBox();  }
[解决办法]
C# code
        private void PrintBox()        {            for (int i = 1; i <= 9; i++)            {                int[,] array = new int[i * 2 - 1, i * 2 - 1];                array[i - 1, i - 1] = 1;                for (int j = 0; j < i * 2 - 1; j++)                    for (int k = 0; k < i * 2 - 1; k++)                    {                        array[j, k] = Math.Max(Math.Abs(j - i + 1), Math.Abs(k - i + 1)) + 1;                        if (k != i * 2 - 2)                            Console.Write(array[j, k]);                        else                            Console.WriteLine(array[j, k]);                    }                Console.WriteLine("----------");            }        }
[解决办法]
受wdgphc启发,再改改
C# code
private void PrintBox(){     for (int i = 1; i <= 9; i++)         for (int j = 0; j < i * 2 - 1; j++)             for (int k = 0; k < i * 2 - 1; k++)                 Console.Write(Math.Max(Math.Abs(j - i + 1), Math.Abs(k - i + 1)) + 1 + (k == i * 2 - 2 ? j == i * 2 - 2 ? "\n------\n" : "\n" : ""));}
[解决办法]
探讨
所以,我觉得措辞是“比谁写的逻辑最简练”更好,而不是“比谁写的代码少”。

[解决办法]
看看!
[解决办法]
up
[解决办法]
探讨
其实这个问题的逻辑解题思路不止一种,例如不仅仅是考虑递归然后补充四边的数字。

但是凑出最终每一个数字的一个天书公式,对训练编程设计技术并没有什么作用,如果用形式逻辑规则来写这个程序则可以看出这是最没有逻辑扩展性的思路。

[解决办法]
挺好玩的!!
用递归,刚才有人说了!!
[解决办法]
我的目的更单纯:接分!
[解决办法]
探讨
其实上面所有程序只有两种逻辑、两种思路的区别而已。

软件工程已经有很多论述,编写程序时要朴实一点,没有必要为了一点点非逻辑原因而过分凑巧地设计。

[解决办法]
一定要c#?
[解决办法]
探讨
受wdgphc启发,再改改

C# code
private void PrintBox()
{
for (int i = 1; i <= 9; i++)
for (int j = 0; j < i * 2 - 1; j++)
for (int k = 0; k < i * 2 - 1; k++)
Console.Write(Math.Max(Math.Abs(j - i + 1), Math.Abs(k - i + 1)) + 1 + (k == i * 2 - 2 ? j == i * 2 - 2 ? "\n------\n" : "\n" : ""));
}

[解决办法]


print "回"
[解决办法]
mark
[解决办法]

探讨
引用:
受wdgphc启发,再改改

C# code
private void PrintBox()
{
for (int i = 1; i <= 9; i++)
for (int j = 0; j < i * 2 - 1; j++)
for (int k = 0; k < i * 2 - 1; k++)
Console.Write(Math.Max(Math.Abs(j - i + 1), Math.Abs(k - i + 1)) + 1 + (k == i * 2 - 2 ? j == i * 2 - 2 ? "\n------\n" : "\n" : ""));
}


我也改了一下…
for (int i = 0; i < 9; i++)
for (int j = -i; j <= i; j++)
for (int k = -i; k <= i; k++)
Console.Write(Math.Max(Math.Abs(j), Math.Abs(k)) + 1 + (k == i ? j == i ? "\n------\n" : "\n" : ""));


[解决办法]
嗯,我来个逻辑最简单的

C# code
static void PrintBox()    {        // TODO : 自由发挥        Console.WriteLine(@"1            -------            222            212            222            -------            33333            32223            32123            32223            33333            -------            4444444            4333334            4322234            4321234            4322234            4333334            4444444            -------            555555555            544444445            543333345            543222345            543212345            543222345            543333345            544444445            555555555            -------            66666666666            65555555556            65444444456            65433333456            65432223456            65432123456            65432223456            65433333456            65444444456            65555555556            66666666666            -------            7777777777777            7666666666667            7655555555567            7654444444567            7654333334567            7654322234567            7654321234567            7654322234567            7654333334567            7654444444567            7655555555567            7666666666667            7777777777777            -------            888888888888888            877777777777778            876666666666678            876555555555678            876544444445678            876543333345678            876543222345678            876543212345678            876543222345678            876543333345678            876544444445678            876555555555678            876666666666678            877777777777778            888888888888888            -------            99999999999999999            98888888888888889            98777777777777789            98766666666666789            98765555555556789            98765444444456789            98765433333456789            98765432223456789            98765432123456789            98765432223456789            98765433333456789            98765444444456789            98765555555556789            98766666666666789            98777777777777789            98888888888888889            99999999999999999 ");    }
[解决办法]
猛人不少嘛


[解决办法]
寒37楼
[解决办法]
先发一贴:
C# code
static void printbox(int num){    for (int i = 0; i < num * 2 - 1; i++)    {        for (int j = 0; j < num * 2 - 1; j++)        {            Console.Write(Math.Max(Math.Abs(i - num + 1), Math.Abs(j - num + 1)) + 1);        }        Console.WriteLine();    }} 


[解决办法]
发完贴后,才知道有很多人跟我的算法一样,那就再来一贴试试

C# code
static void printbox(){    for (int num = 1; num < 10; num++)    {        int n = num * 2 - 1;        for (int i = 0; i < n * n; )        {            Console.Write((Math.Max(Math.Abs(i % n - num + 1), Math.Abs(i / n - num + 1)) + 1) + (++i % n == 0 ? "\n" : ""));        }        Console.Write("-------\n");    }}
[解决办法]
探讨
潜力贴,MARK

[解决办法]
C# code
static void printbox(){    for (int x = 1; x < 10; x++)    {        int n = x * 2 - 1;        for (int i = 0; i < n * n; )            Console.Write((Math.Max(Math.Abs(i % n - x + 1), Math.Abs(i / n - x + 1)) + 1) + (++i % n == 0 ? "\n" : ""));        Console.Write("-------\n");    }}
[解决办法]
看贴不回好像然被人BS,所以路过回一下.
看来最简化的公式看来只有以下两个了.
1. Math.Max(Math.Abs(i - num + 1), Math.Abs(j - num + 1)) + 1
2. (Math.Max(Math.Abs(i % n - x + 1), Math.Abs(i / n - x + 1)) + 1) + (++i % n == 0 ? "\n" : "")

[解决办法]
放在Web工程里调试的,所以多加了一个重载。

C# code
    void PrintBox()    {        PrintBox(Console.Out);    }    void PrintBox(TextWriter writer)    {        StringBuilder line;        string[] lines;        for (int num = 1; num <= 9; num++)        {            lines = new string[num * 2 - 1];            line = new StringBuilder(new string(' ', num * 2 - 1));            for (int l = num; l > 0; l--)            {                for (int c = num; c > 0; c--)                    line[num - c] = line[num + c - 2] = (char)((l > c ? l : c) + 48);                lines[num - l] = lines[num + l - 2] = line.ToString();            }            writer.WriteLine(string.Join("\n", lines));            writer.WriteLine(new string('-', 8));        }    }
[解决办法]
虽然很长,但觉得还算逻辑比较简单
C# code
const int Number = 5;static void Print(string[] args){    int rank = GetRank(Number);    int[,] matrix = new int[rank, rank];    for (int i = Number; i > 0; i--)    {        SetMatric(matrix, rank, i);    }    PrintResult(rank, matrix);}private static int GetRank(int n){    return n * 2 - 1;}private static void SetMatric(int[,] matrix, int rank, int n){    int row1 = Number - n;    int row2 = rank - (Number - n) - 1;    int colOffice = Number - n;    int count = GetRank(n);    for (int i = 0; i < count; i++)    {        matrix[row1, colOffice + i] = n;  // 上面行        matrix[row2, colOffice + i] = n;// 下面行        if (i < count - 2)        {            matrix[row1 + i + 1, colOffice] = n;// 左列            matrix[row1 + i + 1, rank - colOffice - 1] = n;// 右列        }    }}private static void PrintResult(int rank, int[,] matrix){    for (int i = 0; i < rank; i++)    {        for (int j = 0; j < rank; j++)        {            Console.Write(matrix[i, j]);        }        Console.Write(Environment.NewLine);    }}
[解决办法]
//这是完整的代码
using System;
class MyClass
{
public static int[,] output(int n)
{
int[,] final = new int[n * 2 - 1,n * 2 - 1];
for (int i = n; i >= 1; i--)
{
for (int y = 0; y < i * 2 - 1; y++)
{
for (int x = 0; x < i * 2 - 1; x++)


{
final[x + n - i, y + n - i] = i;
}
}
}//核心代码只有这么多,下面是打印
for (int y = 0; y < n * 2 - 1; y++)
{
for (int x = 0; x < n * 2 - 1; x++)
{
Console.Write(final[x,y]);
}
Console.Write("\n");
}
}
static void Main()
{
output(10);
}
}
[解决办法]
递归做,超过10就难看了

class Program
{
static void Main(string[] args)
{
test();
Console.ReadKey();
}
static void test()
{
for (int i = 1; i < 10; i++) {
int[,] result = new int[i * 2 - 1, i * 2 - 1];

print(result, i * 2 - 1, 0, 0, i);
test1(result, i);

Console.WriteLine("===============================");
}
}
static void print(int[,] r,int rank,int row,int column,int ran)
{
if (rank == 1) {
r.SetValue(1, row, column);
return;
}

for (int i = row; i < rank; i++)
{
for (int j = column; j < rank; j++)
{
if (i == row || j == column || i == rank - 1 || j == rank - 1) r.SetValue(ran, i, j);

}
}

print(r, rank - 1, row + 1, column + 1, ran - 1);
 
}
static void test1(int[,] t, int rank) {
for (int i = 0; i < rank*2-1; i++)
{
for (int j = 0; j < rank * 2 - 1; j++)
{
Console.Write(t.GetValue(i,j));

}
Console.WriteLine();
}
}
}
[解决办法]
不会 .net 用 Java 写了个来凑热闹,呵呵

Java code
public class Test01 {        public static void main(String[] args) {        for(int n = 1; n < 10; n++) {            for (int i = 0 - (n - 1); i < n; i++) {                for (int j = 0 - (n - 1); j < n; j++) {                    System.out.print(Math.abs(i) >= Math.abs(j) ? Math.abs(i) + 1 : Math.abs(j) + 1);                }                System.out.println();            }            System.out.println("-------");        }    }}
[解决办法]
用对角线可以将整个回字形化成4个部分,一样的结构,只是位置不一样而已
发下我的代码
C# code
        public void Print(int iCount)        {            int iRow = 2 * iCount - 1;            int[,] array = new int[iRow, iRow];            for (int i = 0; i <iCount ; i++)            {                for (int j = i; j < iRow - i; j++)                {                    // 数据填充部分                    array[i, j] = iCount - i;                    array[iRow - 1 - i, j] = iCount - i;                    array[j, i] = iCount - i;                    array[j, iRow - 1 - i] = iCount - i;                }            }            for (int i = 0; i < iRow; i++)            {                for (int j = 0; j < iRow; j++)                {                    Console.Write(array[i, j].ToString() + " ");                }                Console.WriteLine();            }        }
[解决办法]
递归,不过太长了,而且字符串拼接次数太多。。。
C# code
        private void PrintBox()        {            for (int i = 1; i < 10; i++)            {                foreach (var item in PrintBoxCore(i))                {                    Console.WriteLine(item);                }                Console.WriteLine("-----");            }        }        private IEnumerable<string> PrintBoxCore(int i)        {            string s = i.ToString();            if (i == 1)            {                yield return s;            }            else            {                yield return new string(s[0], i * 2 - 1);                foreach (var item in PrintBoxCore(i - 1))                {                    yield return s + item + s;                }                yield return new string(s[0], i * 2 - 1);            }        } 


[解决办法]

C/C++ code
#define T 8#define N T*2+1    int M=N;    int arr[N][N]={0};    while(M>0)    {        for(int i=N-M;i<M;i++)        {            for(int j=N-M;j<M;j++)            {                arr[i][j]=M-T;            }        }        M--;    }        for(int i=0;i<N;i++)    {        for(int j=0;j<N;j++)        {            printf("%d ",arr[i][j]);        }        printf("\n");    }
[解决办法]

先贴 自己的破代码。。。逻辑比较简单 =.= 比较土...

在学习在ls的各位算法....

C/C++ code
#include<iostream>using namespace std;void PrintBox(int n){    for(int i = 1; i <= 2 * (n - 1) + 1; i++)    {        int m = i > n ? 2 * n - i:i;        int j = n - m + 1;        for(int k = n; k > j; k--)            cout<<k;//每行的递减部分        for(int k = 1; k <= 2 * (j - 1) + 1; k++)            cout<<j;//每行的相等部分,输出每个数的第一行 都为2 * (j - 1) + 1次        for(int k = j + 1; k <= n; k++)            cout<<k;//每行的递增部分        cout<<endl;    }}int main(){    for(int i = 1; i < 10; i++)    {        PrintBox(i);        cout<<endl;        cout<<"----------------------------------";        cout<<endl;    }    return 0;}
[解决办法]
a(i,j)=max(|n-i|,|n-j|)+1;
C# code
        static void  PrintBox(int m)        {            for (int n=1;n<=m;n++)            {                int p=2*n-1;                for (int i=1;i<=p;i++)                    for (int j=1;j<=p;j++)                        Console.Write(Math.Max(Math.Abs(n-i),Math.Abs(n-j))+1);                    Console.Write("\n");                Console.Write("-------\n");            }        }
[解决办法]
static void PrintBox(int m)
{
for (int n=1;n<=m;n++)
{
int p=2*n-1;
for (int i=1;i<=p;i++)
{
for (int j=1;j<=p;j++)
Console.Write(Math.Max(Math.Abs(n-i),Math.Abs(n-j))+1);
Console.Write("\n");
}
Console.Write("-------\n");
}
}

热点排行