以寻路的思想解决算法问题
背景:最近有人让我帮忙做道面试题,游戏公司的,想了想可以用游戏中寻路的思维,或许可以提高他成功的机会。
根据输入列数输出上图效果,有兴趣的童鞋可以试试,主要是以比较有趣模拟寻路的方式实现上述效果,应了那句柳暗花明又一村,问题也变得有趣起来了。
说一下思路:从
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();
}
}