public void Find(Solwrt solwrt) { SolutionFinder finder = new SolutionFinder(); IList solutions = finder.FindSolutions(new KnightSolutionEnumerator(hatesMap, needsMap, KnigtsNumber)); foreach (KnightSolution solution in solutions) { solwrt.Write(solution.ToString()); } }
public override void Solve() { int cpart, cch; Pparser.Fetch(out cpart, out cch); var rgst = Pparser.FetchN <string>(cpart).ToArray(); var mpnodeByst = new Dictionary <string, Node>(); foreach (var st in rgst) { var stA = st.Substring(0, 5); var stB = st.Substring(st.Length - 5); if (!mpnodeByst.ContainsKey(stA)) { mpnodeByst[stA] = new Node(stA); } if (!mpnodeByst.ContainsKey(stB)) { mpnodeByst[stB] = new Node(stB); } var edge = new Edge(st, mpnodeByst[stA], mpnodeByst[stB]); mpnodeByst[stA].rgedgeOut.Add(edge); mpnodeByst[stB].rgedgeIn.Add(edge); } var rgedge = Euler(new HashSet <Node>(mpnodeByst.Values)).ToArray(); Sanity(rgedge, rgst); string stResult = ""; stResult = rgedge[0].st; for (int i = 1; i < rgedge.Length; i++) { stResult += rgedge[i].st.Substring(5); } using (Output) { Solwrt.Write(stResult); } }
public override void Solve() { var st = Fetch <string>(); int cch = st.Length / 2; var rgc = new int[cch]; for (int i = 0; i < cch; i++) { rgc[i] = (st[2 * i] - 'A') * 16 + st[2 * i + 1] - 'A'; } var rgb = new int[cch]; for (int i = 0; i < cch; i++) { int k = i + 1; if (FPrime(k)) { rgb[i] = (rgc[i] - k + 512) % 256; } else { rgb[i] = rgc[i]; } } var rga = new int[cch]; rga[0] = rgb[0]; for (int i = 1; i < cch; i++) { rga[i] = (rgb[i] - rgb[i - 1] + 512) % 256; } st = new string(rga.Select(a => (char)a).ToArray()); var rgch = new char[cch]; int s = (int)Math.Sqrt(cch); { var rgaPrev = new List <int>(); for (int ip = cch - 1; ip >= 0; ip--) { if (rgaPrev.Count > 1) { int p = rgaPrev[0]; rgaPrev[0] = rgaPrev[1]; rgaPrev[1] = p; } if (rgaPrev.Count > 12) { rgaPrev = rgaPrev.Skip(rgaPrev.Count - 12).Concat(rgaPrev.Take(rgaPrev.Count - 12)).ToList(); } rgaPrev.Insert(0, rga[ip]); } rga = rgaPrev.ToArray(); } { int i = 0; int d = 0; while (i < cch) { for (int l = d; l >= 0; l--) { int x = d - l; int y = d - x; if (x >= s) { break; } if (x < 0 || x > s - 1 || y < 0 || y > s - 1) { continue; } rgch[x + y * s] = (char)rga[i++]; } d++; } } st = new string(rgch); using (Output) { Solwrt.Write("{0}", st); } }
public void Write(object obj) { Solwrt.Write(obj); }
public override void Solve() { var pparser = new Pparser(FpatIn); int n, l; pparser.Fetch(out n, out l); var rgnode = pparser.FetchN <Node>(n); rgnode.Add(new Node("X")); n++; var solver = Google.OrTools.LinearSolver.Solver.CreateSolver("IntegerProgramming", "CBC_MIXED_INTEGER_PROGRAMMING"); for (int i = 0; i < n; i++) { rgnode[i].varU = solver.MakeIntVar(0, n, "U{0}".StFormat(i)); } var mpnodeByVarout = new Dictionary <Variable, Node>(); var rgvarx = new List <Variable>(); for (var i = 0; i < n; i++) { for (var j = 0; j < n; j++) { if (i == j) { continue; } if (Node.FMatch(rgnode[i], rgnode[j])) { var varXij = solver.MakeIntVar(0, 1, "x{0}_{1}".StFormat(i, j)); rgvarx.Add(varXij); rgnode[i].rgvarOut.Add(varXij); rgnode[j].rgvarIn.Add(varXij); mpnodeByVarout[varXij] = rgnode[j]; if (i > 0 && j > 0) { solver.Add(rgnode[i].varU - rgnode[j].varU + varXij * n <= n - 1); } } } } foreach (var node in rgnode) { solver.Add(new SumVarArray(node.rgvarOut.ToArray()) == 1); solver.Add(new SumVarArray(node.rgvarIn.ToArray()) == 1); } solver.Maximize(new SumVarArray(rgvarx.ToArray())); solver.SetTimeLimit(60 * 1000); var resultStatus = solver.Solve(); double min, max; if (resultStatus == Google.OrTools.LinearSolver.Solver.OPTIMAL) { min = max = solver.Objective().Value(); var nodeCur = rgnode.Last(); int s = 0; var rgst = new List <string>(); while (nodeCur != null) { Console.WriteLine("{0}\t{1}", ++s, nodeCur.st); rgst.Add(nodeCur.st); var varOut = nodeCur.rgvarOut.SingleOrDefault(var => var.SolutionValue() == 1); if (varOut != null) { nodeCur = mpnodeByVarout[varOut]; } else { nodeCur = null; } if (nodeCur == rgnode.Last()) { break; } } rgst = rgst.Skip(1).ToList(); string stResult = ""; stResult = rgst[0]; for (int i = 1; i < rgst.Count; i++) { stResult += rgst[i].Substring(5); } using (Output) { Solwrt.Write(stResult); } } else { min = solver.Objective().Value(); max = solver.Objective().BestBound(); } Console.WriteLine(min); Console.WriteLine(max); }