以寻路的思想解决算法问题

来源:互联网 发布:吉他视频教学软件 编辑:程序博客网 时间:2024/06/04 19:03

以寻路的思想解决算法问题

Alt text

背景:最近有人让我帮忙做道面试题,游戏公司的,想了想可以用游戏中寻路的思维,或许可以提高他成功的机会。
根据输入列数输出上图效果,有兴趣的童鞋可以试试,主要是以比较有趣模拟寻路的方式实现上述效果,应了那句柳暗花明又一村,问题也变得有趣起来了。
说一下思路:从1到最大值就像一条路径一样,从1开始走,一直绕圈朝里走到终点,意会~
直接上代码
enter code here
using UnityEngine;
using System.Collections;
using System.Text;
public class TestSqFun :MonoBehaviour{
//数据容器
public int[,] arry;
//终点值
[Header("最大值")]
public int max;
//看规律分为几种前进类型
int style=0;
[Header("输入")]
public int value;
void Start()
{
Cal(value);
}
void Cal(int input)
{
//初始化
InitializePath(input);
//开始赋值
CalculateNode(input);
//输出
PrintArry(input);
}
/// <summary>
/// 初始化,计算最大值,并把空白标出设为不可走区域
/// </summary>
/// <param name="index">输入</param>
private void InitializePath(int index)
{
arry = new int[index,index];
for (int i = 0; i < index; i++)
{
for (int j = 0; j < i; j++)
{
arry[i, j] = -1;
max++;
}
}
max = arry.Length - max;
}
/// <summary>
/// 数据赋值
/// </summary>
/// <param name="index"></param>
private void CalculateNode(int index)
{
int X = index - 1;
int Y = index - 1;
arry[X, Y] = 1;
style = 0;
for (int i = 0; i < arry.Length; i++)
{
style = (i/(index-1))%3;
//到达目标
if (arry[X, Y].Equals(max))
{
break;
}
//记录上一次位置信息
int lastNode = arry[X, Y];
//出发
ClaMoveStyle(true,ref X, ref Y);
//已经被覆盖
if (!arry[X, Y].Equals(0)|| arry[X, Y].Equals(-1))
{
//禁止覆盖区域(空白)
ClaMoveStyle(false, ref X, ref Y);
continue;
}
//覆盖新区域
arry[X, Y] = lastNode+1;
}
}
/// <summary>
/// 根据类型,计算前进或者原地
/// </summary>
/// <param name="canMove">前进或者退回原地</param>
/// <param name="currnetX">当前坐标x</param>
/// <param name="currentY">当前坐标y</param>
private void ClaMoveStyle(bool canMove,ref int currnetX,ref int currentY)
{
switch (style)
{
case 0:
if (canMove)
{
currnetX--;
}
else
{
currnetX++;
}
break;
case 1:
if (canMove)
{
currentY--;
}
else
{
currentY++;
}
break;
case 2:
if (canMove)
{
currnetX++;
currentY++;
}
else
{
currnetX--;
currentY--;
}
break;
default:
break;
}
}
/// <summary>
/// 输出
/// </summary>
/// <param name="index"></param>
private void PrintArry(int index)
{
StringBuilder str = new StringBuilder();
for (int i = 0; i < index; i++)
{
StringBuilder temp = new StringBuilder();
for (int j = 0; j < index; j++)
{
//將-1恢復空白
//为了制表格式
if (arry[i, j].Equals(-1))
{
temp.Append("\t");
}
else
{
temp.Append(arry[i, j]+"\t");
}
}
str.AppendLine(temp.ToString());
}
SaveFile(str.ToString());
}
/// <summary>
/// 保存文件
/// </summary>
/// <param name="data"></param>
private void SaveFile(string data)
{
System.IO.FileStream fStream = new System.IO.FileStream("Assets/data.xlsx", System.IO.FileMode.OpenOrCreate);
byte[] bytes = System.Text.ASCIIEncoding.UTF8.GetBytes(data);
fStream.Write(bytes,0,bytes.Length);
fStream.Close();
}
}

抛砖引玉欢迎大家讨论!

阅读全文
0 0
原创粉丝点击