请用循环控制编写程序,输出如下图格式图形(数字菱形)
下方所示 1 1 2 1 1 2 3 2 1 1 2 3 4 3 2 1 1 2 3 4 5 4 3 2 1 1 2 3 4 3 2 1 1 2 3 2 1 1 2 1 1
请用循环控制编写程序,输出如下图格式图形(数字菱形)
下方所示 1 1 2 1 1 2 3 2 1 1 2 3 4 3 2 1 1 2 3 4 5 4 3 2 1 1 2 3 4 3 2 1 1 2 3 2 1 1 2 1 1
看到这种题目,第一个想法还是递归.
public static void p_3(int n){ p_3_0(1,n); } private static void p_3_0(int i ,int n){ if(i==n){p_3_1(i,n);return;} p_3_1(i,n); p_3_0(i+1,n); p_3_1(i,n); } private static void p_3_1(int i,int n){ p_3_2(n-i); p_3_3(1,i); System.out.println(); } private static void p_3_2(int n){ System.out.print(' '); if(n>0)p_3_2(n-1); } private static void p_3_3(int i,int n){ if(n==i){System.out.print(i);return;} System.out.print(i); p_3_3(i+1,n); System.out.print(i); }
如果搞个额外空间来保存位置的话,代码可以漂亮点,DFS,BFS之类的.
public static void p_2(int n){ int [][] d = new int[2*n-1][2*n-1]; p_2_0(n, n-1, n-1, d); print(d); } private static void p_2_0(int n , int x ,int y,int [][]d){ if(d[x][y]<n)d[x][y]=n; if(n>1){p_2_0(n-1,x-1,y,d);p_2_0(n-1,x,y-1,d);p_2_0(n-1,x+1,y,d);p_2_0(n-1,x,y+1,d);} } private static void print(int [][]d){ for(int i=0;i<d.length;i++){ for(int j =0 ;j<d[0].length;j++){ System.out.print(d[j][i]==0?" ":d[j][i]); } System.out.println(); } }
改成循环也不错,还符合OP要求.
public static void p_1(int n){ int [][] d = new int[2*n-1][2*n-1]; int x=n-1,y=n-1; for(int i =0 ;i<n;i++){ for(int j = 0 ; j<=i;j++){ d[x+j][y+(i-j)]=(n-i); d[x+-1*j][y+-1*(i-j)]=(n-i); d[x+-1*j][y+(i-j)]=(n-i); d[x+j][y+-1*(i-j)]=(n-i); } } print(d); }
期待漂亮的递归写法.
package main import ( "fmt" ) func main() { max := 9 op := 1 i := 1 for i > 0{ for j := 1; j <= max * 2; j++ { if (j < max - i + 1) { fmt.Print(" ") } else if (j >= max - i + 1 && j <= max) { fmt.Print(j + i - max, " ") } else if (j > max && j < max + i) { fmt.Print(i - j + max, " ") } } fmt.Println() i += op; if i == max { op = -1 } } }
不会写java,用go语言写了个循环