2

これは数時間私を悩ませていたので、誰かが私を助けてくれるかどうか疑問に思っていました.

無限の幅と高さを持つグリッド上の x 座標と y 座標のセットからブール値を取得できるようにしたいと考えています。他の制約もあります.x軸に沿って、2つの真の値の間に少なくともn個の場所が必要です.0,0からx,yまでの領域の真の値の数も知る必要があります.

getTrueCoordinatesInArea に指定された領域の幅と高さは、領域が 0,0 から x,y まで作成されるため、x と y に等しくなります。

それが理にかなっていれば..

たとえば、次のようになります。

value = coordinateContainsTrue( x, y );//return true or false.
total = getTrueCoordinatesInArea( x , y );//Returns the total true values inside the area.

編集:これはシードから機能します。

4

1 に答える 1

0

あなたが何を必要としているのか正確にはわかりませんが、良い楽しいエクササイズのように思えました. 私はそれがあなたが望んでいたものであることを望みました. =) 私が望んでいたように正確にコーディングされていません。むしろ bool[,] 配列を使用したかったのですが、それを動的にする方法がわからず、このために独自のクラスをコーディングしたくありませんでしたが、おそらく使用する必要があります。

ただし、このソリューションは機能するはずです。

private List<List<bool>> grid = new List<List<bool>>();

private int N = 4;

Random randomNumberGenerator = new Random();

private bool getRandomBoolean()
{
    return this.randomNumberGenerator.Next(0, 2) == 1;
}

private void testProgram()
{
    var containsTrue = coordinateContainsTrue(0, 10);
    var total = getTrueCoordinatesInArea(14, 2);
    var isTrue = coordinateIsTrue(15, 11);
}

private bool coordinateIsTrue(int x, int y)
{
    expandGridOfNeeded(x, y);

    return grid[x][y];
}

private bool coordinateContainsTrue(int x, int y)
{
    expandGridOfNeeded(x, y);

    for (int xTemp = 0; xTemp < x; xTemp++) // Loop columns
    {
        for (int yTemp = 0; yTemp < y; yTemp++) // Loop rows
        {
            if (grid[xTemp][yTemp])
                return true; // Return true if any true was found
        }
    }

    return false;
}

private int getTrueCoordinatesInArea(int x, int y)
{
    expandGridOfNeeded(x, y);

    var total = 0;

    for (int xTemp = 0; xTemp < x; xTemp++) // Loop columns
    {
        for (int yTemp = 0; yTemp < y; yTemp++) // Loop rows
        {
            if (grid[xTemp][yTemp])
                total++; // Increase count if true was found
        }
    }

    return total;
}

private void expandGridOfNeeded(int x, int y)
{
    if (x < 0 || y < 0)
        return;

    // Add needed columns
    while (grid.Count <= x)
    {
        var column = new List<bool>();

        // Only add rows if the others have rows
        if (grid.Count > 0)
        {
            while (column.Count < grid[0].Count)
            {
                // Check if legal to add a true value, if it is then add random else add false
                bool forceFalseValue = false;
                for (int i = grid.Count - 1; i > grid.Count + N && forceFalseValue == false; i--)
                {
                    forceFalseValue = grid[i][column.Count - 1];
                }

                column.Add(forceFalseValue ? false : getRandomBoolean());
            }
        }

        grid.Add(column);
    }

    // Add needed rows
    while (grid[0].Count <= y)
    {
        var counter = N;

        foreach (var column in grid)
        {
            // Check if legal to add a true value, if it is then add random else add false
            if (counter < N)
            {
                column.Add(false);
                counter++;
            }
            else
            {
                var randomValue = getRandomBoolean();

                if (randomValue)
                    counter = 0;
                else
                    counter++;

                column.Add(randomValue);
            }
        }
    }
}
于 2014-06-10T15:04:32.237 に答える