【算法比赛】打印有变化规律的数字正方形,看谁的代码扩展性、可读性最好。
要求:
打印一组有变化规律的正方形(规则自己分析了)
如下是宽度为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 | | | | |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*/
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
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; }
[解决办法]
我也简单实现了一下第一题:
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++好用
[解决办法]
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
[解决办法]
接上面
#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”可以这样:
Console.Write("{0}{1:D2}", i > 0 ? " " : "", Numbers[i, j]);
[解决办法]
不错
[解决办法]
收藏一下 有空做
[解决办法]
纯粹为了接分而来!
------解决方案--------------------
帅气 就喜欢这样的题
今天活忙 有时间研究下
感觉不难实现
俺是学数学的!
为数学骄傲
[解决办法]
很牛????
要学习学习
[解决办法]
先收藏了,很好的学习和锻炼的题目!!
[解决办法]
学习,收藏
[解决办法]
时间来不及了,先做了2个.
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(); } }
[解决办法]
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)
[解决办法]
总觉得应该有更好办法的 而不是一个个输出来
------解决方案--------------------
这个题真的很考人的逻辑思维, 有时间来 做一下!!!!!
[解决办法]
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();
}
}
}
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();
}
}
}
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"); } }
[解决办法]
for(int j=0;j<arr.GetLength(1);j++){
Console.Write(arr[i,j].ToString("00") + ",");
}
Console.WriteLine();
}
}
}
这个才是真的
[解决办法]
呵呵 有意思的题目 比上次的难了蛮多。。。
[解决办法]
路过,,,
[解决办法]
这个以前在mssql版有人画过,呵
[解决办法]