2011-11-26 101 views
2

我面臨一個問題,我的大腦不能處理! 我需要循環,創建模式是這樣的:廣場爲環形圖案

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 

所以內部的數量越大它的,但我就是不明白我怎麼能創造這樣的循環 我需要爲我的AI,所以我可以爲實體感興趣的領域,所以這是沒有學校分配新建分配FY和我所到目前爲止已經試過

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

我實在想不出辦法讓代表其數量級是它! 我一直在試圖想象這個自己等想弄清楚如何創建這個或創建這個最好的方式..請幫助我和我的頭腦從頭痛! :)我想是在是很容易理解的任何語言簡單的僞代碼或代碼(如Java,C++,C ...)

+0

i == 0是第一行。 j == 0是第一列 – barlop

+0

如果你只是嘗試瞭解一下沒有那個方塊的for循環,你就不會頭痛。只需打印i和j,然後打印*,並嘗試弄清for循環如何協同工作。如果你甚至不知道如何獲得代表你所在級別的數字,那麼在這個問題上工作並不會讓你感到頭痛,並且會爲你的廣場做好準備。它不那麼陡峭。這很明顯,你必須能夠作爲一名程序員分解。 – barlop

+0

我知道如何循環一起工作,但我沒有得到這個想法我怎麼可能計算當前數字的「水平」(距邊界),因爲我從來沒有想過我可以計算距離最近的邊界(謝謝......)但是,無論如何謝謝 – Ruuhkis

回答

4

你可以這樣來做:

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(); 
} 
+0

*摩擦眼睛*這是完美的!從來沒有想過計算距最近邊界的距離!非常感謝,你讓我的一天! – Ruuhkis

+0

@Ruuhkis - 你應該「接受」這個答案,如果這是最好的幫助你解決問題的方法:)你可以通過點擊答案左邊的「打勾」來實現。 –

0

製作你的 」?」是1 + i,j,(行-1)-i和(cols-1)-j的最小值。

2

你想要的數字是水平或垂直到邊緣的最小距離。在僞代碼:

min(i, j , n - 1 - j, n - 1 - i) + 1 
0

所以從外面一維的距離是這樣的(讓我們首先考慮行):

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

哪裏min是一些函數,它返回兩個值中的較小。

OK,讓我們再次做同樣的事情在列:

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

現在要計算在每個單元格的值是:

min(distanceR, distanceC) + 1 
0
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
 //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

在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

這是我在ActionScript中的代碼(java環境不是很方便在我的comp)。如果你願意等幾分鐘,我會後的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(); 
} 

輸出

1111111 
1222221 
1233321 
1234321 
1233321 
1222221 
1111111 
0

批,因爲我是一個瘋子

C:\>t 
11111 
12221 
12321 
12221 
11111 

C:\> 

你可以改變f rom m = 5 n = 5至m = 7 n = 7 e.t.c.

@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