using UnityEngine;
public class Point
{
public int x;
public int y;
public int v;
public override string ToString()
{
return string.Format("拐点坐标>>({0},{1})拐点坐标值>>{2};", x, y, v);
}
}
public class LL : MonoBehaviour
{
/// <summary>
/// 0代表可走路径
/// </summary>
public int[,] graph = new int[4, 4]
{
{ 1, 2, 0 ,1},
{ 1, 0, 0 ,1},
{ 2, 1, 2 ,1},
{ 2, 1, 2 ,1}
};
private int colNumber;
private int rowNubmer;
private void Awake()
{
rowNubmer = 4;//行数
colNumber = 4;//列数
}
private void Start()
{
//直连
if (NoCornor(GetP(1, 0), GetP(1, 3)))
{
print("直连");
}
//一拐
Point p;
if (OneCornor(GetP(0, 1), GetP(2, 2), out p))
{
print("一拐");
print(p.ToString());
}
//两拐
Point p1, p2;
if (TwoCornor(GetP(1, 0), GetP(0, 3), out p1, out p2))
{
print("两拐");
print(p1.ToString() + "\n" + p2.ToString());
}
}
/// <summary>
/// 判断直连的情况
/// </summary>
/// <param name="p1">输入点1</param>
/// <param name="p2">输入点2</param>
/// <returns>是否走通</returns>
public bool NoCornor(Point p1, Point p2)
{
if (!p1.v.Equals(p2.v))
{
return false;
}
return NoCornorReal(p1, p2);
}
/// <summary>
/// 判断直连的情况具体实现
/// </summary>
/// <param name="p1">输入点1</param>
/// <param name="p2">输入点2</param>
/// <returns>是否走通</returns>
private bool NoCornorReal(Point p1, Point p2)
{
if (!p1.x.Equals(p2.x) && !p1.y.Equals(p2.y))
{
return false;
}
if (p1.x.Equals(p2.x))
{
int minindex = Mathf.Min(p1.y, p2.y);
int maxindex = Mathf.Max(p1.y, p2.y);
for (int i = minindex + 1; i < maxindex; i++)
{
if (graph[p1.x, i] != 0)
{
return false;
}
}
}
if (p1.y.Equals(p2.y))
{
int minindex = Mathf.Min(p1.x, p2.x);
int maxindex = Mathf.Max(p1.x, p2.x);
for (int i = minindex + 1; i < maxindex; i++)
{
if (graph[i, p1.y] != 0)
{
return false;
}
}
}
return true;
}
/// <summary>
/// 判断一个拐点的情况
/// </summary>
/// <param name="p1">输入点1</param>
/// <param name="p2">输入点2</param>
/// <param name="onePoint">返回拐点</param>
/// <returns>是否走通</returns>
public bool OneCornor(Point p1, Point p2, out Point onePoint)
{
if (!p1.v.Equals(p2.v))
{
onePoint = null;
return false;
}
return OneCornorReal(p1, p2, out onePoint);
}
/// <summary>
/// 判断一个拐点的情况具体实现
/// </summary>
/// <param name="p1">输入点1</param>
/// <param name="p2">输入点2</param>
/// <param name="onePoint">返回拐点</param>
/// <returns>是否走通</returns>
private bool OneCornorReal(Point p1, Point p2, out Point onePoint)
{
Point cornor1 = GetP(p1.x, p2.y);
Point cornor2 = GetP(p2.x, p1.y);
if (cornor1.v == 0 && NoCornorReal(cornor1, p1) && NoCornorReal(cornor1, p2))
{
onePoint = cornor1;
return true;
}
if (cornor2.v == 0 && NoCornorReal(cornor2, p1) && NoCornorReal(cornor2, p2))
{
onePoint = cornor2;
return true;
}
onePoint = null;
return false;
}
/// <summary>
/// 判断两个拐点情况
/// </summary>
/// <param name="p1">输入点1</param>
/// <param name="p2">输入点2</param>
/// <param name="op1">返回第一个拐点</param>
/// <param name="op2">返回第二个拐点</param>
/// <returns>是否走通</returns>
public bool TwoCornor(Point p1, Point p2, out Point op1, out Point op2)
{
for (int i = 0; i < colNumber; i++)
{
Point po1 = GetP(p1.x, i);
Point c1;
if (po1.v == 0 && NoCornorReal(po1, p1) && OneCornorReal(po1, p2, out c1))
{
op1 = po1;
op2 = c1;
return true;
}
}
for (int i = 0; i < rowNubmer; i++)
{
Point po2 = GetP(i, p1.y);
Point c2;
if (po2.v == 0 && NoCornorReal(po2, p1) && OneCornorReal(po2, p2, out c2))
{
op1 = po2;
op2 = c2;
return true;
}
}
op1 = null;
op2 = null;
return false;
}
/// <summary>
/// 通过索引的到point对象
/// </summary>
/// <param name="i"></param>
/// <param name="j"></param>
/// <returns>point对象</returns>
public Point GetP(int i, int j)
{
Point p = new Point();
p.x = i;
p.y = j;
p.v = graph[i, j];
return p;
}
}