java编写在n*n的方格内所有行和列相加之和相等的程序,n为自己输入,自动生成一个n*n的数组
解决方案 »
- final疑问
- 我希望编写一个下载www.tianya.cn论坛煮酒论史所有的网页
- 关于Java io 中编码解码的问题
- 新人就是问题多,大侠支招吧~
- 请伸手--关于java里内部类参数传递的困惑
- java filewriter 与 outputstream 问题
- 哪里有together的keymaker?
- 我用appletviewer浏览applet,提示找不到文件,这是怎么会事,我在html里浏览也是找不到文件!
- 如何得到ASCII码值?
- 求 Java核心技术卷二(新版) 源代码,收到代码后高分相送!
- java中如何查询,修改,删除文件指定中的数据啊??不用数据库!!
- 请哪位帮我看看这段小程序?
public static void main(String[] args){
int[][] a = new int[100][100];
int n = 5; for(int i=0;i<n;i++){
int[] b = new int[n];
randoms(b,n);
for(int j=0;j<n;j++){
a[i][j] = b[j];
}
for(int k=0;k<i;k++){
for(int l=0;l<n;l++){
if(a[i][l]==a[k][l]){
int kk = (int)(Math.random()*n);
int x = a[i][kk];
a[i][kk] = a[i][l];
a[i][l] = x;
k=-1;
break;
}
}
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
System.out.print(a[i][j]+" ");
}
System.out.println();
}
}
public static void randoms(int[] a,int x){
for(int i=0;i<x;i++){
while(true){
boolean isC = true;
a[i] = (int)(Math.random()*x+1);
for(int j=0;j<i;j++){
if(a[i]==a[j])
isC = false;
}
if(isC)
break;
}
}
}
}在网吧做的,比较吵,思路不是很清晰,你先看看结果对不,改变n的值可以改变矩阵大小,写的有点乱,明天我再想想吧,我要LOL了。
这个是9宫问题的扩展
9宫算法
3
2 6
1 5 9
4 8
7首先 延对角线左下到右上3个3个排列数据,每1次3个数排列的时候,开始位置偏移1个位置,得出一个菱形
然后 把菱形转成正方形,以菱形的中间对角线456列位基准,
把行列超越位置的数按中线(159,357是菱形的中线)反转到相应的位置,如图
| 3 |
---------------
| 2 | 7 | 6 |
------------------
1 | 9 | 5 | 1 | 9 |
------------------
| 4 | 3 | 8 |
------------------
| 7 |
得到正方形
| 2 | 7 | 6 |
------------------
| 9 | 5 | 1 |
------------------
| 4 | 3 | 8 |
就是结果
此法适用于n为奇数情况,例子代码
*/
public class Test {
public static void main(String[] args) throws Throwable {
doMatrix(5);
} public static void doMatrix(int n) {
if (n%2 == 0) n++; //保证n为奇数
int strLen = String.valueOf(n*n).length();
String format = String.format("%%%ds ", strLen);
int[][] matrix = new int[n][n];
for (int i=1, rs=n/2, cs=-n/2, r=rs, c=cs; i<=n*n; i++) {
matrix[(r < 0) ? n+r : (r >= n ? r-n : r)][(c < 0) ? n+c : (c >= n ? c-n : c)] = i;
r--;
c++;
if (i%n == 0) {
rs++;
cs++;
r = rs;
c = cs;
}
}
int sum = 0;
for (int i=0; i<n; i++) {
for (int j=0; j<n; j++) {
System.out.printf(format, matrix[i][j]);
if (i == 0 ) {sum+=matrix[i][j];}
}
System.out.println();
}
System.out.printf("--------------------\n%d\n", sum);
}
}
public static void main(String[] args) {
int n = 5;
int[][] a = new int[100][100];
for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) {
if (i == 0) {
a[i][j] = j + 1;
} else {
if (j > 0) {
a[i][j] = a[i - 1][j - 1];
} else {
a[i][j] = a[i - 1][n - 1];
}
}
}
}
randoms(a,n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print(a[i][j]);
}
System.out.println();
}
}
public static void randoms(int[][] a,int n){
for(int i=0;i<n;i++){
int x = (int)(Math.random()*n);
int y = (int)(Math.random()*n);
for(int j=0;j<n;j++){
int num = a[j][x];
a[j][x] = a[j][y];
a[j][y] = num;
}
}
for(int i=0;i<n;i++){
int x = (int)(Math.random()*n);
int y = (int)(Math.random()*n);
for(int j=0;j<n;j++){
int num = a[x][j];
a[x][j] = a[y][j];
a[y][j] = num;
}
}
}
}这是改良版,算法很简单,先在二维数组第一行按照1~n进行写入,然后每行依次按照前一行向后移动一位,就像:
12345
51234
45123
34512
23451
然后就随机移动一下行行列列的就OK了,也可以达到你说那个效果。