求助此程序:n*n的方格内所有行和列相加之和相等 java编写在n*n的方格内所有行和列相加之和相等的程序,n为自己输入,自动生成一个n*n的数组 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 public class Text{ 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 61 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 class Text { 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进行写入,然后每行依次按照前一行向后移动一位,就像:1234551234451233451223451然后就随机移动一下行行列列的就OK了,也可以达到你说那个效果。 如何得到字符串并且放到arraylist<string>中 深度优先搜索二维数组 Object clone() 的一些讨论 JAVA程序怎么从文件中读取数据----在线等--急!!! 请问netscape javascript这个包,在哪里下载,下载之后存放到哪个路径里面啊? SwingWorker 导致 MYSQL java.sql.SQLException 关于包的问题. 接口到底是什么,与什么用处啊? 请问函数getDocumentBase()的情况? 帮我看看这是什么错误,谢谢 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了,也可以达到你说那个效果。