问个菜鸟级别的问题,求解题思路

xingxiaobai 2012-05-02 08:14:48
现有一个n*n的单元,要求用C#设计实现按如下图所示访问,求思路啊。
...全文
157 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
歌神的卖 2012-05-02
  • 打赏
  • 举报
回复
代码如下:数组对应此图,16个格子即数组chessboard[,]的16个数,线条从chessboard[0,0]进入,方向向东。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace nn
{
class Program
{
/// <summary>
/// 定义4个运动方向
/// </summary>
public enum Direction
{
东,
南,
西,

}

/// <summary>
/// 向东走
/// </summary>
static void MoveEast(int x,int y,int[,] chessboard)
{
if (y + 1 <= chessboard.GetUpperBound(1))
{
if (chessboard[x, y + 1] != 1)
{ Move(Direction.东, x, y + 1, chessboard); }
else
{Move(Direction.南, x, y, chessboard);}
}
else
{
Move(Direction.南, x , y, chessboard);
}
}

/// <summary>
/// 向南走
/// </summary>
static void MoveSouth(int x,int y,int[,] chessboard)
{
if(x+1<=chessboard.GetUpperBound(0))
{
if (chessboard[x + 1, y] != 1)
{ Move(Direction.南, x + 1, y, chessboard);}
else
{ Move(Direction.西, x, y, chessboard);}
}
else
{
Move(Direction.西, x, y, chessboard);
}
}

/// <summary>
/// 向西走
/// </summary>
static void MoveWest(int x,int y,int[,] chessboard)
{
if (y > 0)
{
if (chessboard[x, y - 1] != 1)
{ Move(Direction.西, x, y - 1, chessboard); }
else
{ Move(Direction.北, x, y, chessboard); }
}
else
{ Move(Direction.北, x , y, chessboard); }
}

/// <summary>
/// 向北走
/// </summary>
static void MoveNorth(int x,int y,int[,] chessboard)
{
if (x > 0 )
{
if(chessboard[x-1, y] != 1)
Move(Direction.北, x-1, y, chessboard);
else
{ Move(Direction.东, x, y, chessboard); }
}
else
{ Move(Direction.东, x, y, chessboard); }
}

/// <summary>
/// 判断程序是否结束
/// </summary>
static bool IsEnd(int x, int y, int[,] chessboard)
{
if (x > 0 && x < chessboard.GetUpperBound(1) && y > 0 && y < chessboard.GetUpperBound(0))
{
if (chessboard[x, y] == 1 && chessboard[x + 1, y] == 1 && chessboard[x - 1, y] == 1 && chessboard[x, y + 1] == 1 && chessboard[x, y - 1] == 1)
return true;
else
return false;
}
else
{ return false; }
}

/// <summary>
/// 向下一格子运动
/// </summary>
static void Move(Direction direct,int x,int y,int[,] chessboard)
{
if (IsEnd(x, y, chessboard))
{
return;//程序满足结束条件,则结束
}

if (chessboard[x, y] != 1)
{
chessboard[x, y] = 1;//输出结果
Console.WriteLine(x + "," + y);//这里也可以把x,y值保存起来
}
switch(direct)
{
case Direction.东:
MoveEast(x,y,chessboard);
break;
case Direction.南:
MoveSouth(x,y,chessboard);
break;
case Direction.西:
MoveWest(x,y,chessboard);
break;
case Direction.北:
MoveNorth(x,y,chessboard);
break;
}
}

static void Main(string[] args)
{
int[,] chessboard =new int[4, 4]{{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}};//我们用棋盘数组表示4*4表格
//将初始值都设为0;表示为未被访问,1为访问过。
//从数组0,0进入,并且初始的方向是向东走
Move(Direction.东, 0, 0, chessboard);
Console.Read();
}
}
}

代码运行的结果:
0,0 0,1 0,2 0,3 1,3 2,3 3,3 3,2 3,1 3,0 2,0 1,0 1,1 1,2 2,2 2,1

这个问题其实就是数据结构中的走迷宫问题,我的方法比较简单,是针对此图,在数据结构严蔚敏那本书里,栈的应用中会有走迷宫问题的求解方法,希望能对你有帮助
mizuho_2006 2012-05-02
  • 打赏
  • 举报
回复
菜鸟级别的问题我也不会
freestyleSago 2012-05-02
  • 打赏
  • 举报
回复
这算法。牛B。打打酱油。佩服
laokaizzz 2012-05-02
  • 打赏
  • 举报
回复
使用画笔画么,是的话,动态改变画的两头坐标就好了
laokaizzz 2012-05-02
  • 打赏
  • 举报
回复
楼上直接就把代码给出了,实诚人
polk6 2012-05-02
  • 打赏
  • 举报
回复
            int n = 9; //大小
int s = 0;
int[,] jgg = new int[n,n];

for (int i = 0; i < n/2; i++)
{


for (int j = i; j < n-i; j++) //上面一排
{
jgg[i, j] = s++;
}
for (int j = 1+i; j < n-1-i; j++) //右面一排
{

jgg[j, n - 1 - i] = s++;
}
for (int j = n-1-i; j >=i; j--) //下面一排
{
jgg[n - 1 - i, j] = s++;
}
for (int j = n - 2-i; j >= 1+i; j--) //左面一排
{
jgg[j, i] = s++;
}

}
jgg[n / 2, n / 2] = s; //中心点赋值
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
Console.Write(jgg[i,j]+ " ");

}
Console.WriteLine();
}
Console.ReadKey();


比较笨的方法,你参考下

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧