import java.util.*;
public class lianxi {
public static void main(String[] args) {
int N=3;
int[][] a = new int[N][N];
int i=0; //行
int j=N/2; //列
a[i][j]=1;
for(int n=2;n<=N*N;n++)
{
//往45度方向放下一个数字
i--;
j++;
if(i<0 && j>=N)//两边越界,//行和列都越界
{
i=i+2;
j--;
}
else if(i<0)//行越界
{
i=N-1;
}
else if(j>=N) //列越界
{
j=0;
}
else if(a[i][j]!=0) //有冲突
{
i=i+2;
j--;
}
a[i][j]=n;
}
//输出
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
System.out.print(a[i][j] + "\t");
}
System.out.println();
}
}
}
结果是:
8 1 6
3 5 7
4 9 2
import java.util.*;
public class lianxi2 {
public static void main(String[] args) {
int N = 3;
int[][] a = new int[N][N];
int i = 0;
int j = N/2;
a[i][j] = 1;
for(int n=2;n<=N*N;n++){
i--;
j++;
if(i<0 && j>=N){
i+=2;
j--;
}
else if(i<0){
i=N-1;
}
else if(j>=N){
j=0;
}
else if(a[i][j]!=0){
i+=2;
i--;
}
a[i][j]=n;
}
for(i=0;i<N;i++){
for(j=0;j<N;j++){
System.out.print(a[i][j]+"\t");
}
System.out.println();
}
}
}
结果是:
7 1 5
3 4 6
0 8 9
实际运用中没有区别,在运行效率中是有区别的,i=i+2操作中,先是读取左边i的地址,然后再次读取右边i的地址,i加2,然后把它赋值给左边的i;i+=2是只读一次i的地址,然后加2,再赋值到i。还有,你的代码上下有区别
1.执行效率
2.类型转换
详细请看:http://biyutong.iteye.com/blog/1424087
我实际中用的二者没有什么区别
区别就是+=有一个强制类型转换。不过都是int就没什么区别了;
你这上下的代码不一样,不是i=i+2 和 i+=2的区别。
else if(a[i][j]!=0) //有冲突
{
i=i+2;
j--;
}
这个地方 一个是 j--; 一个是 i--;
与C语言中的有相似性
没区别 两种写法而已。