Ejemplo n.º 1
0
            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());
                }
            }
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 3
0
        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);
            }
        }
Ejemplo n.º 4
0
 public void Write(object obj)
 {
     Solwrt.Write(obj);
 }
Ejemplo n.º 5
0
        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);
        }