квадрат для петли - PullRequest
       1

квадрат для петли

2 голосов
/ 26 ноября 2011

Я столкнулся с проблемой, с которой мой мозг не может справиться!Мне нужно сделать цикл, который создает шаблон следующим образом:

1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1

так что внутреннее число больше его, но я просто не могу понять, как я могу создать такой цикл, мне это нужно для моего ИИ, так что яможет создавать области интересов для сущностей, так что это не школьное задание, и то, что я пробовал до сих пор

for(int i = 0; i < rows; i++){
   for(int j = 0; j < cols; j++){
      System.out.print("?");
   }
   System.out.println();
}

Я действительно не могу придумать, как получить число, представляющее, на каком уровне оно находится!Я пытался визуализировать это для себя и т. Д., Чтобы выяснить, как было бы лучшим способом создать это или создать это вообще .. Пожалуйста, помогите мне и моим мозгам получить головную боль!:) то, что я хочу, это простой псевдокод или код на любом языке, который легко понять (например, Java, C ++, C ...)

Ответы [ 9 ]

4 голосов
/ 26 ноября 2011

Вы можете сделать это так:

for(int i = 0; i < rows; i++){
   for(int j = 0; j < cols; j++){
      // The distance to the left, right, top and bottom border:
      int dl = j;
      int dr = cols - (j+1);
      int dt = i;
      int db = rows - (i+1);

      // The distance to the closest border:
      int d = Math.min(Math.min(dl, dr), Math.min(dt, db));

      // Print according number
      System.out.print(d+1);
   }
   System.out.println();
}
2 голосов
/ 26 ноября 2011

Требуемое число - это минимальное расстояние до края по горизонтали или вертикали. В псевдокоде:

min(i, j , n - 1 - j, n - 1 - i) + 1
0 голосов
/ 26 ноября 2011

Партия, потому что я чокнутый

C:\>t
11111
12221
12321
12221
11111

C:\>

Вы можете перейти от m = 5 n = 5 к m = 7 n = 7 и т. Д.

@ECHO OFF

setlocal EnableDelayedExpansion


set m=5
set n=5
set /A m_minus1=m-1
set /A n_minus1=n-1

SET /A amid=(%m%+1)/2
SET /A bmid=(%n%+1)/2

for /L %%a in (1,1,%m%) do (
  for /L %%b in (1,1,%n%) do (
    IF %%a==1 SET STRING=!STRING!1
    IF %%a==%m% SET STRING=!STRING!1
     IF %%a GEQ 2 (
         IF %%a LEQ %m_minus1% (
              IF %%a==%amid% (
                 if %%b==%bmid% (
                       SET STRING=!STRING!3
                  ) ELSE (

                   IF %%b==1  SET STRING=!STRING!1
                   IF %%b==%n%  SET STRING=!STRING!1
                   IF %%b GEQ 2 (
                      IF %%b LEQ %n_minus1% (
                         SET STRING=!STRING!2
                      ) %/IF LEQ %
                   ) % /IF GEQ %

                  ) % /ELSE %




              ) ELSE (   % /IF a mids equal/not equal % 


                   IF %%b==1  SET STRING=!STRING!1
                   IF %%b==%n%  SET STRING=!STRING!1
                   IF %%b GEQ 2 (
                      IF %%b LEQ %n_minus1% (
                         SET STRING=!STRING!2
                      ) %/IF LEQ %
                   ) % /IF GEQ %

              ) % /ELSE of IF a mids equal/not equal % 

        ) % LEQ 4 %        
    ) % GEQ 2 %
  ) % b for %

  ECHO/!STRING!
  SET STRING=
) % a for % 

endlocal
0 голосов
/ 26 ноября 2011
var rows:int=7;
var cols:int=7;

var mid:int=Math.floor(rows / 2); //Gives the 0 based index of middle row
var max:int=mid+1;
for(var i:int=0; i<rows; i++) {
    var s:String="";
    var diff:int=mid - i;
    var maxNum:int=max - Math.abs(mid - i);
    //trace(maxNum);
    for(var j:int=0; j<cols; j++) {
        var dta:int=Math.abs(j - mid)
        if(max - dta > maxNum) {
            s += maxNum;
        } else {
            s += (max - dta);
        }
    }

    trace(s);
}

Вот мой код в ActionScript (среда Java не очень удобна для моего компа).Если вы подождете несколько минут, я выложу также код java

РЕДАКТИРОВАТЬ

int  rows=7;
int  cols=7;

int  mid=(int) Math.Floor((double)(rows / 2)); //Gives the 0 based index of middle row
int  max=mid+1;
for(int  i=0; i<rows; i++) {
    int  diff=mid - i;
    int  maxNum=max - Math.Abs(mid - i);
    //trace(maxNum);
    for(int  j=0; j<cols; j++) {
        int dta=Math.Abs(j - mid);
        if(max - dta > maxNum) {
            System.out.write(maxNum);
        } else {
            System.out.write(max - dta);
        }
    }

    System.out.writeLine();
}

output

1111111   
1222221   
1233321   
1234321   
1233321   
1222221   
1111111
0 голосов
/ 26 ноября 2011

В Matlab, который индексирует первый элемент в 1, это:

n = 5;
for i = 1:n
    for j = 1:n
        a = [i, j , n - j + 1, n - i + 1];
        fprintf('%d ',(min(a)));
    end
    fprintf('\n');
end
0 голосов
/ 26 ноября 2011
        //create pyramid

        int intCounterX = 0;
        int intCounterY = 0;
        int intElevationX = 0;
        int intElevationY = 0;
        int intElevation = 1;
        int intSide = 5;
        int intMid = (intSide + 1) / 2;

        for (intCounterY = 0; intCounterY < intSide; intCounterY++)
        {
            for (intCounterX = 0; intCounterX < intSide; intCounterX++)
            {
                //determine if we're on an edge
                if (intCounterX == 0 || intCounterY == 0 || intCounterX == (intSide - 1) || intCounterY == (intSide - 1))
                {
                    //edges are always 1
                    intElevation = 1;
                }
                else
                {
                    //increasing elevation to mid, decreasing after
                    //for X
                    if (intCounterX < (intMid - 1))
                    {
                        //going up
                        intElevationX = intCounterX + 1;
                    }
                    else if (intCounterX == (intMid - 1))
                    {
                        //point
                        intElevationX = intMid;
                    }
                    else
                    {
                        //must be going down
                        intElevationX = intCounterX - 1;
                    }

                    //for Y
                    if (intCounterY < (intMid - 1))
                    {
                        //going up
                        intElevationY = intCounterY + 1;
                    }
                    else if (intCounterY == (intMid - 1))
                    {
                        //point
                        intElevationY = intMid;
                    }
                    else
                    {
                        //must be going down
                        intElevationY = intCounterY - 1;
                    }

                    //take the lower of the two
                    if (intElevationX < intElevationY)
                    {
                        //X is lower
                        intElevation = intElevationX;
                    }
                    else
                    {
                        //Y is lower or equal
                        intElevation = intElevationY;
                    }
                }

                Console.Write(intElevation);
            }
            Console.WriteLine();
        }
0 голосов
/ 26 ноября 2011
    int dim = 5;
    int level = 1;
    String line;
    for (int i = 0; i < dim; i++) {
        int l = 0;
        line = "";
        for (int j = 0; j < dim; j++) {

            if (j < (dim / 2)+1) {
                l++;
                if (l > level) {
                    System.out.print(level);
                } else {
                    System.out.print(l);
                }
            } else {
                l--;
                if (l >= level) {
                    System.out.print(level);

                } else {
                    System.out.print(l);

                }
            }
        }
        System.out.println("");

        if (i<dim/2)
            level++; 
        else level--;
    }
0 голосов
/ 26 ноября 2011

Таким образом, расстояние снаружи в одном измерении таково (давайте сначала рассмотрим строки):

distanceR = min(i, rows - 1 - i)

Где min - это некоторая функция, которая возвращает меньшее из двух значений.

ОК, давайте снова сделаем то же самое для столбцов:

distanceC = min(j, cols - 1 - j)

Теперь значение, которое вы хотите вычислить в каждой ячейке:

min(distanceR, distanceC) + 1
0 голосов
/ 26 ноября 2011

Сделайте свое "?"быть 1+ мин из i, j, (строки-1) -i и (столбцы-1) -j.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...