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

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

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();
}
}
抛砖引玉欢迎大家讨论!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VniciGino

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值