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

【算法比赛】打印有变化规律的数字正方形,看哪位高手的代码扩展性、可读性最好

2011-12-24 
【算法比赛】打印有变化规律的数字正方形,看谁的代码扩展性、可读性最好。要求:打印一组有变化规律的正方形(规

【算法比赛】打印有变化规律的数字正方形,看谁的代码扩展性、可读性最好。
要求:
  打印一组有变化规律的正方形(规则自己分析了)
  如下是宽度为8的情况:

C# code
/*01--02--03--04--05--06--07--08                             |28--29--30--31--32--33--34  09 |                       |   |27  48--49--50--51--52  35  10 |   |               |   |   |26  47  60--61--62  53  36  11 |   |   |       |   |   |   |25  46  59  64--63  54  37  12 |   |   |           |   |   |24  45  58--57--56--55  38  13 |   |                   |   |23  44--43--42--41--40--39  14 |                           |22--21--20--19--18--17--16--15//////////////////////////////01--02  06--07  15--16  28--29   /   /   /   /   /   /   /03  05  08  14  17  27  30  43 | /   /   /   /   /   /   / |04  09  13  18  26  31  42  44   /   /   /   /   /   /   /10  12  19  25  32  41  45  54 | /   /   /   /   /   /   / |11  20  24  33  40  46  53  55   /   /   /   /   /   /   /21  23  34  39  47  52  56  61 | /   /   /   /   /   /   / |22  35  38  48  51  57  60  62   /   /   /   /   /   /   /36--37  49--50  58--59  63--64//////////////////////////////01--02  04  07  11  16  22  29   />  /   /   /   /   /   /03  05  08  12  17  23  30  37   />  /   /   /   /   /   /06  09  13  18  24  31  38  44   />  /   /   /   /   /   /10  14  19  25  32  39  45  50   />  /   /   /   /   /   /15  20  26  33  40  46  51  55   />  /   /   /   /   /   /21  27  34  41  47  52  56  59   />  /   /   /   /   /   /28  35  42  48  53  57  60  62   />  />  />  />  />  />  /36  43  49  54  58  61  63--64//////////////////////////////01  09  23  35  45  53  59  63   \   \   \   \   \   \   \>16  02  10  24  36  46  54  60   \   \   \   \   \   \   \>29  17  03  11  25  37  47  55   \   \   \   \   \   \   \>40  30  18  04  12  26  38  48   \   \   \   \   \   \   \>49  41  31  19  05  13  27  39   \   \   \   \   \   \   \>56  50  42  32  20  06  14  28   \   \   \   \   \   \   \>61  57  51  43  33  21  07  15   \>  \>  \>  \>  \>  \>  \>64  62  58  52  44  34  22  08//////////////////////////////64--63--62--61--60--59--58--57                             |37--38--39--40--41--42--43  56 |                       |   |36--35--34--33--32--31  44  55                     |   |   |17--18--19--20--21  30  45  54 |               |   |   |   |16--15--14--13  22  29  46  53             |   |   |   |   |05--06--07  12  23  28  47  52 |       |   |   |   |   |   |04--03  08  11  24  27  48  51     |   |   |   |   |   |   |01--02  09--10  25--26  49--50//////////////////////////////01--02--03--04--05--06--07--08                             |16--15--14--13--12--11--10--09 |                       17--18--19--20--21--22--23--24                             |32--31--30--29--28--27--26--25 |33--34--35--36--37--38--39--40                             |48--47--46--45--44--43--42--41 |49--50--51--52--53--54--55--56                             |64--63--62--61--60--59--58--57*/


输入:正方形的宽度Size(整数,范围2-9)
输出:一组宽度为Size的正方形

输入样例:8
输出样例:
C# code
01  02  03  04  05  06  07  08                              28  29  30  31  32  33  34  09                              27  48  49  50  51  52  35  10                              26  47  60  61  62  53  36  11                              25  46  59  64  63  54  37  12                              24  45  58  57  56  55  38  13                              23  44  43  42  41  40  39  14                              22  21  20  19  18  17  16  15-------01  02  06  07  15  16  28  29                            03  05  08  14  17  27  30  43                              04  09  13  18  26  31  42  44                            10  12  19  25  32  41  45  54                              11  20  24  33  40  46  53  55                            21  23  34  39  47  52  56  61                              22  35  38  48  51  57  60  62                            36  37  49  50  58  59  63  64-------01  02  04  07  11  16  22  29                            03  05  08  12  17  23  30  37                            06  09  13  18  24  31  38  44                            10  14  19  25  32  39  45  50                            15  20  26  33  40  46  51  55                            21  27  34  41  47  52  56  59                            28  35  42  48  53  57  60  62                            36  43  49  54  58  61  63  64-------01  09  23  35  45  53  59  63                             16  02  10  24  36  46  54  60                             29  17  03  11  25  37  47  55                             40  30  18  04  12  26  38  48                             49  41  31  19  05  13  27  39                             56  50  42  32  20  06  14  28                             61  57  51  43  33  21  07  15                             64  62  58  52  44  34  22  08-------64  63  62  61  60  59  58  57                              37  38  39  40  41  42  43  56                              36  35  34  33  32  31  44  55                              17  18  19  20  21  30  45  54                              16  15  14  13  22  29  46  53                              05  06  07  12  23  28  47  52                              04  03  08  11  24  27  48  51                              01  02  09  10  25  26  49  50-------01  02  03  04  05  06  07  08                              16  15  14  13  12  11  10  09                         17  18  19  20  21  22  23  24                              32  31  30  29  28  27  26  25  33  34  35  36  37  38  39  40                              48  47  46  45  44  43  42  41  49  50  51  52  53  54  55  56                              64  63  62  61  60  59  58  57 



提供完整的控制台程序,扩展性、可读性最好的奖励200分,其他酌情散掉。

[解决办法]
有难度 先顶下再说
[解决办法]
收藏
[解决办法]
看上去很难啊。 帮你顶啊!
[解决办法]
kankan
[解决办法]
还有哈..
顶...
[解决办法]
楼主的题太难了,估计这次一倒一大片了。

BTW,最近楼主分是不是多的溢出了 n_n
[解决办法]
mark先~
[解决办法]
又来了 上次作业还没交呢

[解决办法]
难度有点大!!
[解决办法]
嗯,可以酌情散掉了
[解决办法]
题目好多啊
就做第一题吧

C# code
        private const int WIDTH = 8;        private int Min(params int[] vars) // 取最小值        {             //略        }         // 第几圈        private int GetCircle(Point p)        {            return Min(p.X, p.Y, WIDTH - p.X, WIDTH - p.Y);        }        // 方向        private int GetDirection(Point p)        {            switch (GetCircle(p))            {                case p.Y: return 1;                case p.X: return 2;                case WIDTH - p.Y: return 3;                case WIDTH - p.X: return 4;            }        }        // 顺序        private int GetSequence(Point p)        {            switch (GetDirection(p))            {                case 1: return p.X - GetCircle(p) + 1;                case 2: return p.Y - GetCircle(p) + 1;                case 3: return WIDTH - GetCircle(p) + 1 - p.X;                case 4: return WIDTH - GetCircle(p) + 1 - p.Y;            }        }        private int GetValue(Point p)        {            int Value = 0;            for(int i=1;i<GetCircle(p);i++)            {                Value += 4 * (WIDTH - 1 - i * 2);            }            Value += (GetDirection(p) - 1) * (WIDTH - 1 - (GetCircle(p) - 1) * 2) + GetSequence(p);            return Value;        }
[解决办法]
我也简单实现了一下第一题:
C# code
using System;public class ShowData{    public static void Main( string[] args )    {        if(args.Length <= 0){            Console.WriteLine("至少输入一个数字");            return;        }        // 获取输入的行和列        int x,y;        try{            x = int.Parse(args[0]);            if(args.Length > 1)                y = int.Parse(args[1]);            else                y = x;        }catch{            Console.WriteLine("请输入数字");            return;        }                int[,] arr = new int[x,y];        InsertArr(arr, 1, 0);        OutPut(arr);    }        private static void InsertArr(int[,] arr, int level, int numBegin){        int x = arr.GetLength(0);        int y = arr.GetLength(1);        // 判断是否最内圈        if(numBegin >= (x * y))            return;                // 第一行        for(int i=level-1;i<=y-level;i++){            numBegin++;            arr[level-1,i] = numBegin;        }        // 中间行的最后一列        for(int i=level;i<x-level;i++){            numBegin++;            arr[i,y-level] = numBegin;        }        // 最后一行        for(int i=y-level;i>=level-1;i--){            numBegin++;            arr[x-level,i] = numBegin;        }        // 中间行的第一列        for(int i=x-level-1;i>=level;i--){            numBegin++;            arr[i,level-1] = numBegin;        }                // 递归        InsertArr(arr, level+1, numBegin);    }        private static void OutPut(int[,] arr){        for(int i=0;i<arr.GetLength(0);i++){            for(int j=0;j<arr.GetLength(1);j++){                Console.Write(arr[i,j].ToString("00") + ",");            }            Console.WriteLine();        }    }} 


[解决办法]
挖塞!
MARK
[解决办法]
比较烦琐
[解决办法]
看就好了 写这个东西还是C++好用
[解决办法]

C# code
using System;namespace PrintBox{    class Program    {        static void Main(string[] args)        {            Console.Write("请输入2--9的整数:");            string input = Console.ReadLine();            int row = 0;            while (!int.TryParse(input, out row) || (row > 9 || row < 2))            {                Console.Write("请输入2--9的整数:");                input = Console.ReadLine();            }            PrintBox(row);            Console.ReadKey();        }        public static void PrintBox(int row)        {            int[,] array = new int[row, row];            int index = 1;            int j = 0, k = 0;            #region first            int right = row - 1, left = 0, bottom = row - 1, top = 1;            for (int i = 0; i < row / 2 + row % 2; i++)            {                while (k <= right)                    array[j, k++] = index++;                k--;                j++;                while (j <= bottom)                    array[j++, k] = index++;                j--;                k--;                while (k >= left)                    array[j, k--] = index++;                k++;                j--;                while (j >= top)                    array[j--, k] = index++;                j++;                k++;                right--;                left++;                bottom--;                top++;            }            for (int a = 0; a < row; a++)            {                for (int b = 0; b < row; b++)                    Console.Write(array[a, b].ToString().PadLeft(2, '0') + " ");                Console.WriteLine();            }            Console.WriteLine("-----");            #endregion            #region second            index = 1;            j = k = 0;            for (int i = 0; i < 2 * row - 1; i++)            {                while (j + k == i)                {                    array[j, k] = index++;                    if (j == 0 && k == 0)                    {                        k++;                        continue;                    }                    else                    {                        if (j == 0)                        {                            while (j != i)                            {                                j++;                                k--;                                array[j, k] = index++;                            }                            if (j != row - 1)                                j++;                            else                                k++;                            break;                        }                        if (j == row - 1)                        {                            while (k != row - 1)                            {                                j--;                                k++;                                array[j, k] = index++;                            }                            j++;                            break;                        }                        //k++;                        if (k == 0)                        {                            while (k != i)                            {                                j--;                                k++;                                array[j, k] = index++;                            }                            if (k != row - 1)                                k++;                            else                                j++;                            break;                        }                        if (k == row - 1)                        {                            while (j != row - 1)                            {                                j++;                                k--;                                array[j, k] = index++;                            }                            k++;                            break;                        }                        //j++;                    }                }            }            for (int a = 0; a < row; a++)            {                for (int b = 0; b < row; b++)                    Console.Write(array[a, b].ToString().PadLeft(2, '0') + " ");                Console.WriteLine();            }            Console.WriteLine("-----");            #endregion            #region third            index = 1;            j = k = 0;            for (int i = 0; i < 2 * row - 1; i++)            {                while (j + k == i)                {                    array[j, k] = index++;                    if (j == 0 && k == 0)                    {                        k++;                        continue;                    }                    else                    {                        if (j == 0)                        {                            while (j != i)                            {                                j++;                                k--;                                array[j, k] = index++;                            }                            if (j == row - 1 && k == 0)                            {                                j = k + 1;                                k = row - 1;                                break;                            }                            if (j != row - 1)                            {                                k = j + 1;                                j = 0;                            }                        }                        if (k == row - 1 && j != 0)                        {                            while (j != row - 1)                            {                                j++;                                k--;                                array[j, k] = index++;                            }                            if (k == row - 1 && j == row - 1)                                break;                            if (k != row - 1)                            {                                j = k + 1;                                k = row - 1;                            }                        }                    }                }            }            for (int a = 0; a < row; a++)            {                for (int b = 0; b < row; b++)                    Console.Write(array[a, b].ToString().PadLeft(2, '0') + " ");                Console.WriteLine();            }            Console.WriteLine("-----");            #endregion 


[解决办法]
接上面

C# code
            #region fourth            index = 1;            j = k = 0;            for (int i = 0; i < row; i++)            {                j = 0;                k = i;                for (j = 0; k < row; )                {                    array[j, k] = index++;                    j++;                    k++;                }                if (i != 0)                {                    j = i;                    k = 0;                    for (k = 0; j < row; )                    {                        array[j, k] = index++;                        j++;                        k++;                    }                }            }            for (int a = 0; a < row; a++)            {                for (int b = 0; b < row; b++)                    Console.Write(array[a, b].ToString().PadLeft(2, '0') + " ");                Console.WriteLine();            }            Console.WriteLine("-----");            #endregion            #region fifth            index = row * row;            j = k = 0;            right = row - 1;            left = 0;            bottom = row - 1;            top = 1;            for (int i = 0; i < row / 2 + row % 2; i++)            {                while (k <= right)                    array[j, k++] = index--;                j++;                k--;                while (j <= bottom)                    array[j++, k] = index--;                k--;                j--;                while (j >= top)                    array[j--, k] = index--;                k--;                j++;                while (k >= left)                    array[j, k--] = index--;                j++;                k++;                right -= 2;                top += 2;            }            for (int a = 0; a < row; a++)            {                for (int b = 0; b < row; b++)                    Console.Write(array[a, b].ToString().PadLeft(2, '0') + " ");                Console.WriteLine();            }            Console.WriteLine("-----");            #endregion            #region sixth            index = 1;            j = k = 0;            for (int i = 0; i < row; i++)            {                if (k == 0)                {                    for (; k < row; )                    {                        array[j, k] = index++;                        k++;                    }                    j++;                    if (k == row)                        k--;                    continue;                }                if (k == row - 1)                {                    for (; k >= 0; )                    {                        array[j, k] = index++;                        k--;                    }                    j++;                    if (k < 0)                        k++;                    continue;                }            }            for (int a = 0; a < row; a++)            {                for (int b = 0; b < row; b++)                    Console.Write(array[a, b].ToString().PadLeft(2, '0') + " ");                Console.WriteLine();            }            Console.WriteLine("-----");            #endregion        }    }}
[解决办法]
输出“00”可以这样:
C# code
Console.Write("{0}{1:D2}", i > 0 ? " " : "", Numbers[i, j]);
[解决办法]
不错
[解决办法]
收藏一下 有空做
[解决办法]
纯粹为了接分而来!
------解决方案--------------------


帅气 就喜欢这样的题
今天活忙 有时间研究下
感觉不难实现
俺是学数学的!
为数学骄傲
[解决办法]
很牛????
要学习学习
[解决办法]
先收藏了,很好的学习和锻炼的题目!!
[解决办法]
学习,收藏
[解决办法]
时间来不及了,先做了2个.

C# code
        private void p1(int n)        {            int[,] array = new int[n, n];            array[0, 0] = 1;            int gridx = 0, gridy = 0, forward = 6;            for (int i = 2; i <= n * n; i++)            {                switch (forward)                {                    case 2:                        if ((gridy - 1 >= 0) && (array[gridx, gridy - 1] == 0))                            array[gridx, --gridy] = i;                        else                        {                            array[++gridx, gridy] = i;                            forward = 6;                        }                        break;                    case 4:                        if ((gridx - 1 >= 0) && (array[gridx - 1, gridy] == 0))                            array[--gridx, gridy] = i;                        else                        {                            array[gridx, --gridy] = i;                            forward = 2;                        }                        break;                    case 6:                        if ((gridx + 1 < n) && (array[gridx + 1, gridy] == 0))                            array[++gridx, gridy] = i;                        else                        {                            array[gridx, ++gridy] = i;                            forward = 8;                        }                        break;                    case 8:                        if ((gridy + 1 < n) && (array[gridx, gridy + 1] == 0))                            array[gridx, ++gridy] = i;                        else                        {                            array[--gridx, gridy] = i;                            forward = 4;                        }                        break;                }            }            printArray(array, n);        }        private void p2(int n)        {            int[,] array = new int[n, n];            array[0, 0] = 1; array[1, 0] = 2;            int gridx = 1, gridy = 0, forward = 7;            for (int i = 3; i <= n * n; i++)            {                switch (forward)                {                    case 3:                        if ((gridx + 1 < n) && (gridy - 1 >= 0) && (array[gridx + 1, gridy - 1] == 0))                            array[++gridx, --gridy] = i;                        else                        {                            if (gridx + 1 < n)                                array[++gridx, gridy] = i;                            else                                array[gridx, ++gridy] = i;                            forward = 7;                        }                        break;                    case 7:                        if ((gridx - 1 >= 0) && (gridy + 1 < n) && (array[gridx - 1, gridy + 1] == 0))                            array[--gridx, ++gridy] = i;                        else                        {                            if (gridy + 1 < n)                                array[gridx, ++gridy] = i;                            else                                array[++gridx, gridy] = i;                            forward = 3;                        }                        break;                }            }            printArray(array, n);        }        private void printArray(int[,] array, int num)        {            for (int i = 0; i < num; i++)            {                for (int j = 0; j < num; j++)                    Console.Write(array[j, i].ToString("00") + " ");                Console.WriteLine();            }        } 


[解决办法]

C# code
using System;namespace PrintArray{    class PrintArray    {        static private void p1(int n)        {            int[,] array = new int[n, n];            array[0, 0] = 1;            int gridx = 0, gridy = 0, forward = 6;            for (int i = 2; i <= n * n; i++)            {                switch (forward)                {                    case 2:                        if ((gridy - 1 >= 0) && (array[gridx, gridy - 1] == 0))                            array[gridx, --gridy] = i;                        else                        {                            array[++gridx, gridy] = i;                            forward = 6;                        }                        break;                    case 4:                        if ((gridx - 1 >= 0) && (array[gridx - 1, gridy] == 0))                            array[--gridx, gridy] = i;                        else                        {                            array[gridx, --gridy] = i;                            forward = 2;                        }                        break;                    case 6:                        if ((gridx + 1 < n) && (array[gridx + 1, gridy] == 0))                            array[++gridx, gridy] = i;                        else                        {                            array[gridx, ++gridy] = i;                            forward = 8;                        }                        break;                    case 8:                        if ((gridy + 1 < n) && (array[gridx, gridy + 1] == 0))                            array[gridx, ++gridy] = i;                        else                        {                            array[--gridx, gridy] = i;                            forward = 4;                        }                        break;                }            }            printArray(array, n);        }        static private void p2(int n)        {            int[,] array = new int[n, n];            array[0, 0] = 1; array[1, 0] = 2;            int gridx = 1, gridy = 0, forward = 7;            for (int i = 3; i <= n * n; i++)            {                switch (forward)                {                    case 3:                        if ((gridx + 1 < n) && (gridy - 1 >= 0))                            array[++gridx, --gridy] = i;                        else                        {                            if (gridx + 1 < n)                                array[++gridx, gridy] = i;                            else                                array[gridx, ++gridy] = i;                            forward = 7;                        }                        break;                    case 7:                        if ((gridx - 1 >= 0) && (gridy + 1 < n))                            array[--gridx, ++gridy] = i;                        else                        {                            if (gridy + 1 < n)                                array[gridx, ++gridy] = i;                            else                                array[++gridx, gridy] = i;                            forward = 3;                        }                        break;                }            }            printArray(array, n);        }        static private void p3(int n)        {            int[,] array = new int[n, n];            array[0, 0] = 1;            int gridx = 0, gridy = 0;            for (int i = 2; i <= n * n; i++)            {                if ((gridx - 1 >= 0) && (gridy + 1 < n))                    array[--gridx, ++gridy] = i;                else                {                    if (gridy + 1 < n)
[解决办法]
总觉得应该有更好办法的 而不是一个个输出来
------解决方案--------------------


这个题真的很考人的逻辑思维, 有时间来 做一下!!!!!
[解决办法]

探讨
又来了 上次作业还没交呢

[解决办法]
楼主分多的溢水了汗死了。
[解决办法]
又散分了?jfjf
每天接分,提高知名度
[解决办法]
我总共才200多分,所以不懂也要帮顶
[解决办法]
只写一个可以吗?
写第二个吧


using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
int len = 0;
if (int.TryParse(Console.ReadLine().Substring(0, 1),out len))
output(matrix(len));
Console.ReadLine();
}

static int[,] matrix(int len)
{
int num = 1;
int[,] matrix = new int[len, len];

int n = 2 * (len - 1);

int x = 0;
for (int i = 0; i <= 2 * len - 1; i++)
{
if (i < len)
x = 0;
else
x = i - len + 1;
while (x <= i && x < len && i - x < len)
{
if (i % 2 == 1)
{
matrix[x, i - x] = num;
}
else
{
matrix[i - x, x] = num;
}
x++;
num++;
}
}

return matrix;
}

static void output(int[,] matrix)
{
for (int i = 0; i < matrix.GetLength(0); i++)
{
for (int j = 0; j < matrix.GetLength(1); j++)
{
Console.Write(matrix[i, j].ToString().PadLeft(2, '0') + " ");
}
Console.WriteLine();
}
}
}
}

[解决办法]
除了最后一题目和第1题,
其他都超级难啊!
[解决办法]
关注!
[解决办法]
继续关注!
[解决办法]
花了几个小时,6个图都比较圆满地解决了.
可读行和扩展性 马马虎虎,呵呵.不废话,上code.
C# code
 
using System;
using System.Collections;
using System.Collections.Generic;

namespace PrintNum2
{
  enum 方向 { 向右=1,向下,向左,向上,向左下,向右上,向右下,向左上,无 };
  struct Point
  {
    public int x;
    public int y;
    public Point(int _x, int _y)
    {
      x=_x;
      y=_y;
    }
  }
  class  ChangeInfo
  {
    public Point    pt原点= new Point (0,0);//起始点坐标
    public int      i原点值=1;//起始点值
    public int      i变化值=1;//变化值 1或-1
    public 方向    起始方向 = 方向.无;
    public Dictionary <方向, List <方向>> dic固定转换 = new Dictionary <方向, List <方向>>();
    public List <Point>  ls离散起始点 = new List <Point> ();


  }
  class csPrintNum
  {
    bool b找到下一点坐标 = false;
    int[,] matrix = null;
    int x;
    int y;
    int v;
    int n;
    方向 last方向 = 方向.无;
    public csPrintNum(int _n, ChangeInfo _info)
    {
      n = _n;
      int iCount = n * n;
      matrix = new int[n, n];
      x = _info.pt原点.x;
      y = _info.pt原点.y;
      v = _info.i原点值;
      matrix[x, y] = v;
      v += _info.i变化值;

      for (int i = 1; i < iCount; i++)//灌入数据_n*_n次到matrix
      { 
        if(i==1)
          Move (_info .起始方向 );
        if (!b找到下一点坐标 && _info .dic固定转换.ContainsKey(last方向))
        {
          List <方向> ls= _info .dic固定转换 [last方向 ] as List <方向>;
          for (int k = 0;!b找到下一点坐标 &&  k < ls.Count; k++)
          {
            Move(ls[k]);
          }
        } 
        //从离散点找下个坐标
        if (!b找到下一点坐标 && _info.ls离散起始点.Count > 0)
        {
          x = _info.ls离散起始点[0].x;
          y = _info.ls离散起始点[0].y;
          last方向 = 方向.无;
          _info.ls离散起始点.RemoveAt(0);
        }
        matrix[x, y] = v;
        v += _info.i变化值;
        b找到下一点坐标 = false;
      }
    }
    bool Move(方向 _方向)
    {
      if (_方向 == 方向.向右 && x < n - 1 && matrix[x + 1, y] == 0)
      {
        x += 1;
        last方向 = _方向;
        b找到下一点坐标 = true;
        return true;
      }
      else if (_方向 == 方向.向左 && x > 0 && matrix[x - 1, y] == 0)
      {
        x -= 1;
        last方向 = _方向;
        b找到下一点坐标 = true;
        return true;
      }
      else if (_方向 == 方向.向上 && y > 0 && matrix[x, y - 1] == 0)
      {
        y -= 1;
        last方向 = _方向;
        b找到下一点坐标 = true;
        return true;
      }
      else if (_方向 == 方向.向下 && y < n - 1 && matrix[x, y + 1] == 0)
      {
        y += 1;
        last方向 = _方向;
        b找到下一点坐标 = true;
        return true;
      }
      else if (_方向 == 方向.向左下 && x > 0 && y < n -1  && matrix[ x -1, y + 1] == 0)
      {
        x -= 1;
        y += 1;
        last方向 = _方向;
        b找到下一点坐标 = true;
        return true;


      }
      else if (_方向 == 方向.向右上 && x < n-1 && y > 0  && matrix[ x + 1, y - 1] == 0)
      {
        x += 1;
        y -= 1;
        last方向 = _方向;
        b找到下一点坐标 = true;
        return true;
      }
      else if (_方向 == 方向.向右下 && x < n - 1 && y < n-1 && matrix[x + 1, y + 1] == 0)
      {
        x += 1;
        y += 1;
        last方向 = _方向;
        b找到下一点坐标 = true;
        return true;
      }
      return false;
    }
    public void PrintMatrix()
    {
      if (matrix != null && matrix.Rank == 2)
      {
        for (int i = 0; i <= matrix.GetUpperBound(0); i++)
        {
          for (int j = 0; j <= matrix.GetUpperBound(1); j++)
          {
            Console.Write(matrix[j, i].ToString("d2") + " ");
          }
          Console.WriteLine();
        }
        Console.WriteLine("-----------");
      }
    }
  }
  class Program
  {
    static void Main(string[] args)
    {
      int n=8;
      ChangeInfo info_1 = new ChangeInfo();
      info_1.起始方向 = 方向.向右;
      info_1.dic固定转换.Add(方向.向右, new List <方向>(new 方向[] { 方向.向右, 方向.向下 }));
      info_1.dic固定转换.Add(方向.向下, new List <方向>(new 方向[] { 方向.向下, 方向.向左 }));
      info_1.dic固定转换.Add(方向.向左, new List <方向>(new 方向[] { 方向.向左, 方向.向上 }));
      info_1.dic固定转换.Add(方向.向上, new List <方向>(new 方向[] { 方向.向上, 方向.向右 }));

      csPrintNum cs1 = new csPrintNum(n, info_1);
      cs1.PrintMatrix();

      ChangeInfo info_2 = new ChangeInfo();
      info_2.起始方向 = 方向.向右;
      info_2.dic固定转换.Add(方向.向右, new List <方向>(new 方向[] { 方向.向左下, 方向.向右上 }));
      info_2.dic固定转换.Add(方向.向下, new List <方向>(new 方向[] { 方向.向右上, 方向.向左下 }));
      info_2.dic固定转换.Add(方向.向左下, new List <方向>(new 方向[] { 方向.向左下, 方向.向下, 方向.向右 }));
      info_2.dic固定转换.Add(方向.向右上, new List <方向>(new 方向[] { 方向.向右上, 方向.向右, 方向.向下 }));
      csPrintNum cs2 = new csPrintNum(8, info_2);
      cs2.PrintMatrix();

      ChangeInfo info_3 = new ChangeInfo();
      info_3.dic固定转换.Add(方向.无, new List <方向>(new 方向[] { 方向.向左下 }));
      info_3.dic固定转换.Add(方向.向左下, new List <方向>(new 方向[] { 方向.向左下 }));
      for (int i = 1; i < n; i++)
        info_3.ls离散起始点.Add(new Point(i, 0));
      for (int i = 1; i < n; i++)
        info_3.ls离散起始点.Add(new Point(n - 1, i));
      csPrintNum cs3 = new csPrintNum(n, info_3);
      cs3.PrintMatrix();

      ChangeInfo info_4 = new ChangeInfo();
      info_4.dic固定转换.Add(方向.无, new List <方向>(new 方向[] { 方向.向右下 }));


      info_4.dic固定转换.Add(方向.向右下, new List <方向>(new 方向[] { 方向.向右下 }));
      for (int i = 1; i < n; i++)
      {
        info_4.ls离散起始点.Add(new Point(i, 0));
        info_4.ls离散起始点.Add(new Point(0, i));
      }
      csPrintNum cs4 = new csPrintNum(n, info_4);
      cs4.PrintMatrix();

      ChangeInfo info_5 = new ChangeInfo();
      info_5.i原点值 = 64;
      info_5.i变化值 = -1;
      info_5.起始方向 = 方向.向右;
      info_5.dic固定转换.Add(方向.向右, new List <方向>(new 方向[] { 方向.向右, 方向.向下 }));
      info_5.dic固定转换.Add(方向.向下, new List <方向>(new 方向[] { 方向.向右, 方向.向下, 方向.向左 }));
      info_5.dic固定转换.Add(方向.向左, new List <方向>(new 方向[] { 方向.向上, 方向.向左, 方向.向下 }));
      info_5.dic固定转换.Add(方向.向上, new List <方向>(new 方向[] { 方向.向上, 方向.向左 }));
      csPrintNum cs5 = new csPrintNum(n, info_5);
      cs5.PrintMatrix();

      ChangeInfo info_6 = new ChangeInfo();
      info_6.起始方向 = 方向.向右;
      info_6.dic固定转换.Add(方向.向右, new List <方向>(new 方向[] { 方向.向右, 方向.向下 }));
      info_6.dic固定转换.Add(方向.向下, new List <方向>(new 方向[] { 方向.向右, 方向.向左 }));
      info_6.dic固定转换.Add(方向.向左, new List <方向>(new 方向[] { 方向.向左, 方向.向下 }));
      csPrintNum cs6 = new csPrintNum(n, info_6);
      cs6.PrintMatrix();
    }
  }
}


[解决办法]
两个都是"硬代码"问题.并不是出在算法上
一个是 csPrintNum cs2 = new csPrintNum(8, info_2); //改成 csPrintNum cs2 = new csPrintNum(n, info_2); 
另一个是 info_5.i起始点值 = 64; // 改成 info_5.i起始点值 = n*n;
再附上更正后的代码,不好意思增加篇幅了
C# code
 
using System;
using System.Collections;
using System.Collections.Generic;

namespace PrintNum
{
  enum 方向 { 向右=1,向下,向左,向上,向左下,向右上,向右下,向左上,无 };//移动
  struct Point
  {
    public int x;
    public int y;
    public Point(int _x, int _y)
    {
      x=_x;
      y=_y;
    }
  }
  class  ChangeInfo
  {
    public Point    pt起始点= new Point (0,0);//起始点坐标
    public int      i起始点值=1;//起始点值
    public int      i变化值=1;//变化值 1或-1
    public 方向    起始方向 = 方向.无;
    public Dictionary <方向, List <方向>> dic固定转换 = new Dictionary <方向, List <方向>>();//状态转化集合,有优先级
    public List <Point>  ls离散起始点 = new List <Point> (); //不连续的起始点集合
  }
  class csPrintNum
  {
    bool b找到下一点坐标 = false;
    方向 last方向 = 方向.无; //上次移动方向
    int[,] matrix = null;
    int x; //横坐标 向右递增
    int y; //纵坐标 向下递增
    int v; //坐标点值
    int n; //方块边长(规模)

    public csPrintNum(int _n, ChangeInfo _info)
    {
      n = _n;
      int iCount = n * n;
      matrix = new int[n, n];
      x = _info.pt起始点.x;
      y = _info.pt起始点.y;
      v = _info.i起始点值;
      matrix[x, y] = v;
      v += _info.i变化值;



      for (int i = 1; i < iCount; i++)//灌入数据到matrix
      { 
        if(i==1)
          Move (_info .起始方向 );
        //从固定转换找下个坐标,dic固定转换里的链表有优先顺序
        if (!b找到下一点坐标 && _info .dic固定转换.ContainsKey(last方向))
        {
          List <方向> ls= _info .dic固定转换 [last方向 ] as List <方向>;
          for (int k = 0;!b找到下一点坐标 &&  k < ls.Count; k++)
          {
            Move(ls[k]);
          }
        } 
        //从离散点找下个坐标
        if (!b找到下一点坐标 && _info.ls离散起始点.Count > 0)
        {
          x = _info.ls离散起始点[0].x;
          y = _info.ls离散起始点[0].y;
          last方向 = 方向.无;
          _info.ls离散起始点.RemoveAt(0);
        }
        //赋值
        matrix[x, y] = v;

        //为下次循环做准备
        v += _info.i变化值;
        b找到下一点坐标 = false;
      }
    }
    bool Move(方向 _方向)
    {
      if (_方向 == 方向.向右 && x < n - 1 && matrix[x + 1, y] == 0)
      {
        x += 1;
        last方向 = _方向;
        b找到下一点坐标 = true;
        return true;
      }
      else if (_方向 == 方向.向左 && x > 0 && matrix[x - 1, y] == 0)
      {
        x -= 1;
        last方向 = _方向;
        b找到下一点坐标 = true;
        return true;
      }
      else if (_方向 == 方向.向上 && y > 0 && matrix[x, y - 1] == 0)
      {
        y -= 1;
        last方向 = _方向;
        b找到下一点坐标 = true;
        return true;
      }
      else if (_方向 == 方向.向下 && y < n - 1 && matrix[x, y + 1] == 0)
      {
        y += 1;
        last方向 = _方向;
        b找到下一点坐标 = true;
        return true;
      }
      else if (_方向 == 方向.向左下 && x > 0 && y < n -1  && matrix[ x -1, y + 1] == 0)
      {
        x -= 1;
        y += 1;
        last方向 = _方向;
        b找到下一点坐标 = true;
        return true;
      }
      else if (_方向 == 方向.向右上 && x < n-1 && y > 0  && matrix[ x + 1, y - 1] == 0)
      {
        x += 1;
        y -= 1;
        last方向 = _方向;
        b找到下一点坐标 = true;
        return true;
      }
      else if (_方向 == 方向.向右下 && x < n - 1 && y < n-1 && matrix[x + 1, y + 1] == 0)


      {
        x += 1;
        y += 1;
        last方向 = _方向;
        b找到下一点坐标 = true;
        return true;
      }
      return false;
    }
    public void PrintMatrix()
    {
      if (matrix != null && matrix.Rank == 2)
      {
        for (int i = 0; i <= matrix.GetUpperBound(0); i++)
        {
          for (int j = 0; j <= matrix.GetUpperBound(1); j++)
          {
            Console.Write(matrix[j, i].ToString("d2") + " ");
          }
          Console.WriteLine();
        }
        Console.WriteLine("-----------");
      }
    }
  }
  class Program
  {
    static void Main(string[] args)
    {
      int n=9;
      ChangeInfo info_1 = new ChangeInfo();
      info_1.起始方向 = 方向.向右;
      info_1.dic固定转换.Add(方向.向右, new List <方向> { 方向.向右, 方向.向下 });
      info_1.dic固定转换.Add(方向.向下, new List <方向> { 方向.向下, 方向.向左 });
      info_1.dic固定转换.Add(方向.向左, new List <方向> { 方向.向左, 方向.向上 });
      info_1.dic固定转换.Add(方向.向上, new List <方向> { 方向.向上, 方向.向右 });
      csPrintNum cs1 = new csPrintNum(n, info_1);
      cs1.PrintMatrix();

      ChangeInfo info_2 = new ChangeInfo();
      info_2.起始方向 = 方向.向右;
      info_2.dic固定转换.Add(方向.向右, new List <方向> { 方向.向左下, 方向.向右上 });
      info_2.dic固定转换.Add(方向.向下, new List <方向> { 方向.向右上, 方向.向左下 });
      info_2.dic固定转换.Add(方向.向左下, new List <方向> { 方向.向左下, 方向.向下, 方向.向右 });
      info_2.dic固定转换.Add(方向.向右上, new List <方向> { 方向.向右上, 方向.向右, 方向.向下 });
      csPrintNum cs2 = new csPrintNum(n, info_2);
      cs2.PrintMatrix();

      ChangeInfo info_3 = new ChangeInfo();
      info_3.dic固定转换.Add(方向.无, new List <方向> { 方向.向左下 });
      info_3.dic固定转换.Add(方向.向左下, new List <方向> { 方向.向左下 });
      for (int i = 1; i < n; i++)
        info_3.ls离散起始点.Add(new Point(i, 0));
      for (int i = 1; i < n; i++)
        info_3.ls离散起始点.Add(new Point(n - 1, i));
      csPrintNum cs3 = new csPrintNum(n, info_3);
      cs3.PrintMatrix();

      ChangeInfo info_4 = new ChangeInfo();
      info_4.dic固定转换.Add(方向.无, new List <方向> { 方向.向右下 });
      info_4.dic固定转换.Add(方向.向右下, new List <方向> { 方向.向右下 });
      for (int i = 1; i < n; i++)
      {
        info_4.ls离散起始点.Add(new Point(i, 0));
        info_4.ls离散起始点.Add(new Point(0, i));
      }
      csPrintNum cs4 = new csPrintNum(n, info_4);
      cs4.PrintMatrix();

      ChangeInfo info_5 = new ChangeInfo();
      info_5.i起始点值 = n*n;
      info_5.i变化值 = -1;
      info_5.起始方向 = 方向.向右;


      info_5.dic固定转换.Add(方向.向右, new List <方向>{ 方向.向右, 方向.向下 });
      info_5.dic固定转换.Add(方向.向下, new List <方向>{ 方向.向右, 方向.向下, 方向.向左 });
      info_5.dic固定转换.Add(方向.向左, new List <方向>{ 方向.向上, 方向.向左, 方向.向下 });
      info_5.dic固定转换.Add(方向.向上, new List <方向>{ 方向.向上, 方向.向左 });
      csPrintNum cs5 = new csPrintNum(n, info_5);
      cs5.PrintMatrix();

      ChangeInfo info_6 = new ChangeInfo();
      info_6.起始方向 = 方向.向右;
      info_6.dic固定转换.Add(方向.向右, new List <方向> { 方向.向右, 方向.向下 });
      info_6.dic固定转换.Add(方向.向下, new List <方向> { 方向.向右, 方向.向左 });
      info_6.dic固定转换.Add(方向.向左, new List <方向> { 方向.向左, 方向.向下 });
      csPrintNum cs6 = new csPrintNum(n, info_6);
      cs6.PrintMatrix();
    }
  }
}





[解决办法]
不靠顶拿分~偶是小菜鸟~刚刚学跑还不会飞`~ 关注一下` 
从中捞点东西~o(∩_∩)o...
[解决办法]
加分,结束。
[解决办法]
楼主的题太难了,估计这次一倒一大片了。 

BTW,最近楼主分是不是多的溢出了 n_n
[解决办法]
顶下
[解决办法]
mark
学习
收藏
[解决办法]
很有难度的题目,先顶再想
[解决办法]
第一个,半面输出
比较墨迹的了:
C# code
static void Main(string[] args)        {            prtquan(8);        }        /*        01--02--03--04--05--06--07--08                                     |        28--29--30--31--32--33--34  09         |                       |   |        27  48--49--50--51--52  35  10         |   |  32           |   |   |        26  47  60--61--62  53  36  11         |   |   |       |   |   |   |        25  46  59  64--63  54  37  12         |   |   |           |   |   |        24  45  58--57--56--55  38  13         |   |  72              77   |        23  44--43--42--41--40--39  14         |                           |        22--21--20--19--18--17--16--15        //////////////////////////////         */        private static void prtquan(int width)        {            //要判断处在地几圈上.            for (int i = 0; i < width; i++)            {                for (int j = 0; j < width; j++)                {                    //判断处在地几圈上,,                    int quan = Math.Min(Math.Min(i + 1, width - i), Math.Min(j + 1, width - j));                    //判断在该圈的哪个面上,                    int value=0;                    for (int z = 0; z < quan; z++)                    {                        if (z == quan) break;                        value += 4 * width - 8 * z - 4;                    }                    //输出上半面                    if (i + 1 == quan)                    {                        value += 8 * quan - 4 * width + j - i - 3;                    }                    //输出右半面                    else if (width - j == quan)                    {                        value -= 3 * width - 5 * quan - i + 1;                    }                    //输出左半面                    else if (j + 1 == quan)                    {                               value-=i-quan;                                           }                    //输出下半面                    else if (width - i == quan)                    {                        value -= width - 3 * quan + j + 1;                                          }                    Console.Write(value.ToString("00") + " ");                }                Console.Write("\r\n");            }        } 


[解决办法]

探讨
那确实。。。还有30000多分不知道怎么花。。。

[解决办法]
学习~!~!~菜鸟飘过
[解决办法]
路过,不发表意思
[解决办法]
先顶起!
[解决办法]
探讨
先顶起!

[解决办法]
佩服啊
我只能写出来第一个
[解决办法]
牛人,帮顶了
[解决办法]
晕啊~!~!
[解决办法]
这么多强人呐!
[解决办法]
很强大~~~~~~~```
[解决办法]
mark jf
[解决办法]
强人很多啊 顶
[解决办法]
不错
[解决办法]
学习下
[解决办法]
一群无聊的人干着一件无聊的事
[解决办法]
楼主每次出题都能轰动一片。。。。顶
[解决办法]
mark 学习
[解决办法]
有意思
[解决办法]
using System;

public class ShowData
{
public static void Main( string[] args )
{
if(args.Length <= 0){
Console.WriteLine("至少输入一个数字");
return;
}
// 获取输入的行和列
int x,y;
try{
x = int.Parse(args[0]);
if(args.Length > 1)
y = int.Parse(args[1]);
else
y = x;
}catch{
Console.WriteLine("请输入数字");
return;
}

int[,] arr = new int[x,y];
InsertArr(arr, 1, 0);
OutPut(arr);
}

private static void InsertArr(int[,] arr, int level, int numBegin){
int x = arr.GetLength(0);
int y = arr.GetLength(1);

// 判断是否最内圈
if(numBegin >= (x * y))
return;

// 第一行
for(int i=level-1;i<=y-level;i++){
numBegin++;
arr[level-1,i] = numBegin;
}
// 中间行的最后一列
for(int i=level;i<x-level;i++){
numBegin++;
arr[i,y-level] = numBegin;
}
// 最后一行
for(int i=y-level;i>=level-1;i--){
numBegin++;
arr[x-level,i] = numBegin;
}
// 中间行的第一列
for(int i=x-level-1;i>=level;i--){
numBegin++;
arr[i,level-1] = numBegin;
}

// 递归
InsertArr(arr, level+1, numBegin);
}

private static void OutPut(int[,] arr){
for(int i=0;i<arr.GetLength(0);i++){


for(int j=0;j<arr.GetLength(1);j++){
Console.Write(arr[i,j].ToString("00") + ",");
}
Console.WriteLine();
}
}
}


这个才是真的 


[解决办法]
呵呵 有意思的题目 比上次的难了蛮多。。。
[解决办法]
路过,,,
[解决办法]
这个以前在mssql版有人画过,呵
[解决办法]

探讨
那确实。。。还有30000多分不知道怎么花。。。

[解决办法]
这个有点晕.
[解决办法]
有难度啊
[解决办法]
厉害楼主
[解决办法]
好贴, 明天把项目验收完了来写代码

mark
[解决办法]
这么多题目,第一题比较容易。
[解决办法]
学习来了
[解决办法]
学习来了!
[解决办法]
jf

热点排行