二进制搜索陷入无限循环

时间:2018-09-12 14:56:31

标签: c#

您好,谢谢您的光临。

我正在努力提高解决问题的能力,并且正在做以下练习: https://www.codingame.com/ide/puzzle/shadows-of-the-knight-episode-1

在每个回合中,您都会得到一个指示,例如:“ U”代表“上”,“ DR”代表“右下”等。

您需要在N转之前将角色移至目标。

我们给定数组的宽度为W,数组的高度为H。

我考虑过要始终计算角色需要移动的方向的中点。

我当前的代码如下:

using System;
using System.Linq;
using System.IO;
using System.Text;
using System.Collections;
using System.Collections.Generic;

/**
 * Auto-generated code below aims at helping you parse
 * the standard input according to the problem statement.
 **/
class Player
{
    static string lastMoveDirection = "";
    static int increasedMoveUnit = 0;
    static int W;
    static int H;
    static int X0;
    static int Y0;

    static void Main(string[] args)
    {
        string[] inputs;
        inputs = Console.ReadLine().Split(' ');
        W = int.Parse(inputs[0]); // width of the building.
        H = int.Parse(inputs[1]); // height of the building.
        int N = int.Parse(Console.ReadLine()); // maximum number of turns before game over.
        inputs = Console.ReadLine().Split(' ');
         X0 = int.Parse(inputs[0]);
         Y0 = int.Parse(inputs[1]);


        // game loop
        while (true)
        {
            N--;
            string bombDir = Console.ReadLine(); // the direction of the bombs from batman's current location (U, UR, R, DR, D, DL, L or UL)

            // Write an action using Console.WriteLine()
            // To debug: Console.Error.WriteLine("Debug messages...");

            Console.Error.WriteLine("Batman pos: " + X0 + " " + Y0); 
            Console.Error.WriteLine("Bomb direction: " + bombDir);
            Console.Error.WriteLine("Width of the array: " + W);
            Console.Error.WriteLine("Height of the array: " + H);

            if(lastMoveDirection == bombDir)
                increasedMoveUnit++;
            else
                increasedMoveUnit = 0;

            switch(bombDir)
            {
            case "DR":
                X0=CalcMoveDistance("X");
                Y0=CalcMoveDistance("Y");
                break;
            case "DL":
                X0=CalcMoveDistance("X", -1);
                Y0=CalcMoveDistance("Y");
                break;
            case "D":
                 Y0=CalcMoveDistance("Y");
                 break;
            case "UR":
                X0=CalcMoveDistance("X");
                Y0=CalcMoveDistance("Y", -1);
                break;
            case "UL":
                X0=CalcMoveDistance("X", -1);
                Y0=CalcMoveDistance("Y", -1);
                break;
              case "U":
                Y0=CalcMoveDistance("Y", -1);      
                break;
            case "L":
                X0=CalcMoveDistance("X", -1); 
                break;
            case "R":
                X0=CalcMoveDistance("X");  
                break;
            }


            // the location of the next window Batman should jump to.
            Console.WriteLine(X0.ToString() + " " + Y0.ToString());
            lastMoveDirection = bombDir;
        }
    }

    private static int CalcMoveDistance(string axis, int direction = 1) 
    {
        int result = 0;
        switch(axis)
        {
        case "X":
            result = (W+X0*direction)/2;
            break;
        case "Y":
            result = (H+Y0*direction)/2;
            break;
        }


        if(axis == "Y" && result + increasedMoveUnit >= H)
            result = H-1;

        else if(axis == "X" && result + increasedMoveUnit >= W)
            result = W-1;
        else
            result += increasedMoveUnit * direction;

        return result;
    }
}

我面临以下困难:

字符从(6,6)开始 它向下移动到(23,33)

正确。

字符开始于(23,33) 它向下移动到(32,47)

正确。

字符以(32,47)开始 它向上移动到(36,6)

正确。

字符以(36,6)开头 它向下移动到(38,33)

正确。

字符开始于(38,33) 下移至(38,46)

正确(非常接近目标)。

字符的开头为(38,46) 它向上移动到(38,7) 距离目标很远...

字符以(38,7)开头 向下移动到(38,33)

比以前更接近目标...

字符以(38,7)开头 下移至(38,47)

这非常接近目标...

字符起始于(38,47) 上移至(38,6) 在Y轴上距离物镜非常远...

我们继续循环进行: 降至(38,33) 降至(38,47) 最多(38,6)

1 个答案:

答案 0 :(得分:0)

我猜是因为你有

while (true)

,而for循环中没有破坏它的地方。

好像您想要的:

while (N >= 0)  // Or just N > 0, depending on your desired use

因为您在循环开始时递减了N