public Squama[] Float(Squama[] dice) { int length = 7; var matrix = GetMatrix(dice, length); var deg = GetArrayFromMatrix(matrix, length); int first = GetFirstPoint(deg); var ringSquama = GetRingSquama(deg); if (ringSquama == null) return null; if (ringSquama.X != -1 && ringSquama.Y != -1) { SetRingSquama(matrix, ringSquama); } else if (ringSquama.X != -1 ^ ringSquama.Y != -1) { return null; } List<int> res = GetQueuePoints(first, matrix, length); if (ringSquama.X != -1) { RemoveRingSquama(ref res, ringSquama); } return (!ValidMatrix(matrix, length)) ? null : ToResult(res); }
private int[,] GetMatrix(Squama[] squama, int length) { var matrix = new int[length, length]; for (int i = 0; i < squama.Length; i++) { matrix[squama[i].X, squama[i].Y] += 1; matrix[squama[i].Y, squama[i].X] += 1; } return matrix; }
private bool TryParseSquamas(string text, out Squama[] squamas) { squamas = null; var list = new List<Squama>(); var set = text.Replace(" ", "").Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries); if (set.Length == set.Count(x => x.Length == 2)) { foreach (var item in set) { int x = Convert.ToInt32(item[0].ToString()); int y = Convert.ToInt32(item[1].ToString()); if (x < 0 || x > 6 || y < 0 || y > 6) { return false; } list.Add(new Squama(x, y)); } squamas = list.ToArray(); return true; } return false; }
private Squama[] ToResult(List<int> res) { var set = new Squama[res.Count - 1]; for (int i = 0; i < res.Count - 1; i++) { set[i] = new Squama(res[i], res[i + 1]); } return set; }
private void SetRingSquama(int[,] matrix, Squama squama) { ++matrix[squama.X, squama.Y]; ++matrix[squama.Y, squama.X]; }
private void RemoveRingSquama(ref List<int> points, Squama squama) { for (int i = 0; i + 1 < points.Count; ++i) { if (points[i] == squama.X && points[i + 1] == squama.Y || points[i] == squama.Y && points[i + 1] == squama.X) { List<int> temp = new List<int>(); for (int j = i + 1; j < points.Count; ++j) temp.Add(points[j]); for (int j = 1; j <= i; ++j) temp.Add(points[j]); points = temp; break; } } }
private Squama GetRingSquama(int[] array) { var squama = new Squama(-1, -1); for (int i = 0; i < array.Length; ++i) { if ((array[i] & 1) == 1) { if (squama.X == -1) squama.X = i; else if (squama.Y == -1) squama.Y = i; else return null; } } return squama; }
private string SquamasToString(Squama[] squamas) { return string.Join("-", squamas.Select(x => string.Format("{0}{1}", x.X, x.Y))); }