給你個(gè)例子:

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了沙依巴克免費(fèi)建站歡迎大家使用!
public class mofang1 {
public static void main(String args[]) {
int j = 3;
int a[][] = new int[j][j];
for (int b = 0; b j; b++) {
for (int d = 0; d j; d++) {
a[b][d] = 0;
}
}
int r = 0;
int c = j / 2;
for (int i = 1; i = j * j; i++) {
a[r][c] = i;
System.out.println("r:" + r + " C:" + c);
r = r - 1;
c = c + 1;
if (r 0)
r = j - 1;
if (c j -1)
c = 0;
if (a[r][c] != 0) {
c = c - 1;
r = r + 2;
if (r 0) {
r = j - 1;
} else if (r j - 1) {
r = r - j;
}
if (c j -1) {
c = c - j;
} else if (c 0) {
c = j - 1;
}
}
}
for (int e = 0; e j; e++) {
for (int f = 0; f j; f++) {
if (a[e][f] 10)
System.out.print(a[e][f] + " ");
else
System.out.print(a[e][f] + " ");
if (f == j - 1)
System.out.println("\n");
}
}
}
}
最笨的方法就是 窮舉。。。
好像有個(gè)什么口訣》》》
1居上行正中央,仿次斜填莫相忘,上出框時(shí)往下填,
右出框時(shí)左邊放,排重便在下格填,右上排重一個(gè)樣。
那就 一直 for 循環(huán)啊
代碼自己寫吧 一個(gè)for 里面 一個(gè)判斷
public class ShuDu {
/**存儲(chǔ)數(shù)字的數(shù)組*/
static int[][] n = new int[9][9];
/**生成隨機(jī)數(shù)字的源數(shù)組,隨機(jī)數(shù)字從該數(shù)組中產(chǎn)生*/
static int[] num = {1,2,3,4,5,6,7,8,9};
public static void main(String[] args) {
//生成數(shù)字
for(int i = 0;i 9;i++){
//嘗試填充的數(shù)字次數(shù)
int time = 0;
//填充數(shù)字
for(int j = 0;j 9;j++){
//產(chǎn)生數(shù)字
n[i][j] = generateNum(time);
//如果返回值為0,則代表卡住,退回處理
//退回處理的原則是:如果不是第一列,則先倒退到前一列,否則倒退到前一行的最后一列
if(n[i][j] == 0){
//不是第一列,則倒退一列
if(j 0){
j-=2;
continue;
}else{//是第一列,則倒退到上一行的最后一列
i--;
j = 8;
continue;
}
}
//填充成功
if(isCorret(i,j)){
//初始化time,為下一次填充做準(zhǔn)備
time = 0;
}else{ //繼續(xù)填充
//次數(shù)增加1
time++;
//繼續(xù)填充當(dāng)前格
j--;
}
}
}
//輸出結(jié)果
for(int i = 0;i 9;i++){
for(int j = 0;j 9;j++){
System.out.print(n[i][j] + " ");
}
System.out.println();
}
}
/**
* 是否滿足行、列和3X3區(qū)域不重復(fù)的要求
* @param row 行號(hào)
* @param col 列號(hào)
* @return true代表符合要求
*/
public static boolean isCorret(int row,int col){
return (checkRow(row) checkLine(col) checkNine(row,col));
}
/**
* 檢查行是否符合要求
* @param row 檢查的行號(hào)
* @return true代表符合要求
*/
public static boolean checkRow(int row){
for(int j = 0;j 8;j++){
if(n[row][j] == 0){
continue;
}
for(int k =j + 1;k 9;k++){
if(n[row][j] == n[row][k]){
return false;
}
}
}
return true;
}
/**
* 檢查列是否符合要求
* @param col 檢查的列號(hào)
* @return true代表符合要求
*/
public static boolean checkLine(int col){
for(int j = 0;j 8;j++){
if(n[j][col] == 0){
continue;
}
for(int k =j + 1;k 9;k++){
if(n[j][col] == n[k][col]){
return false;
}
}
}
return true;
}
/**
* 檢查3X3區(qū)域是否符合要求
* @param row 檢查的行號(hào)
* @param col 檢查的列號(hào)
* @return true代表符合要求
*/
public static boolean checkNine(int row,int col){
//獲得左上角的坐標(biāo)
int j = row / 3 * 3;
int k = col /3 * 3;
//循環(huán)比較
for(int i = 0;i 8;i++){
if(n[j + i/3][k + i % 3] == 0){
continue;
}
for(int m = i+ 1;m 9;m++){
if(n[j + i/3][k + i % 3] == n[j + m/3][k + m % 3]){
return false;
}
}
}
return true;
}
/**
* 產(chǎn)生1-9之間的隨機(jī)數(shù)字
* 規(guī)則:生成的隨機(jī)數(shù)字放置在數(shù)組8-time下標(biāo)的位置,隨著time的增加,已經(jīng)嘗試過的數(shù)字將不會(huì)在取到
* 說明:即第一次次是從所有數(shù)字中隨機(jī),第二次時(shí)從前八個(gè)數(shù)字中隨機(jī),依次類推,
* 這樣既保證隨機(jī),也不會(huì)再重復(fù)取已經(jīng)不符合要求的數(shù)字,提高程序的效率
* 這個(gè)規(guī)則是本算法的核心
* @param time 填充的次數(shù),0代表第一次填充
* @return
*/
public static int generateNum(int time){
//第一次嘗試時(shí),初始化隨機(jī)數(shù)字源數(shù)組
if(time == 0){
for(int i = 0;i 9;i++){
num[i] = i + 1;
}
}
//第10次填充,表明該位置已經(jīng)卡住,則返回0,由主程序處理退回
if(time == 9){
return 0;
}
//不是第一次填充
//生成隨機(jī)數(shù)字,該數(shù)字是數(shù)組的下標(biāo),取數(shù)組num中該下標(biāo)對(duì)應(yīng)的數(shù)字為隨機(jī)數(shù)字
int ranNum = (int)(Math.random() * (9 - time));
//把數(shù)字放置在數(shù)組倒數(shù)第time個(gè)位置,
int temp = num[8 - time];
num[8 - time] = num[ranNum];
num[ranNum] = temp;
//返回?cái)?shù)字
return num[8 - time];
}
}
、4M階幻方和4M + 2階幻方,其中M為自然數(shù),2階幻方不存在。幻方構(gòu)造法主要有:連續(xù)擺數(shù)法、階梯法(樓梯法)、奇偶數(shù)分開的菱形法、對(duì)稱法、對(duì)角線法、比例放大法、斯特雷奇法、LUX法、拉伊爾法(基方、根方合成法)、鑲邊法、相乘法、幻方模式等。
奇數(shù)階幻方構(gòu)造法
Siamese方法(Kraitchik 1942年,pp. 148-149)是構(gòu)造奇數(shù)階幻方的一種方法,說明如下:
把1放置在第一行的中間。
順序?qū)⒌葦?shù)放在右上方格中。
當(dāng)右上方格出界的時(shí)候,則由另一邊進(jìn)入。
當(dāng)右上方格中已經(jīng)填有數(shù),則把數(shù)填入正下方的方格中。
按照以上步驟直到填寫完所有N2個(gè)方格。
(由于幻方的對(duì)稱性,也可以把右上改為右下、左上以及左下等方位)
以5階幻方為例,1填寫在(1,3)(第一行第三列)的位置上;2應(yīng)當(dāng)填寫在其右上方格即(0,4)中,由于(0,4)超出頂邊界,所以從最底行進(jìn)入,即(5,4);3填寫在(5,4)的右上方格(4,5)中;4填寫在(4,5)的右上方格(3,6)中,由于(3,6)超出右邊界,所以從最左列進(jìn)入,即(3,1);5填寫在(3,1)的右上方格(2,2)中;6應(yīng)該填寫的方格(1,3)已經(jīng)被1所占據(jù),因此填寫在(2,2)的正下方格(3,2)中;按照上面的步驟直到所有數(shù)填入。
偶數(shù)階幻方構(gòu)造法
4M階幻方構(gòu)造法
對(duì)于4M階幻方一般都用對(duì)調(diào)法,制作起來很容易。如4階幻方的排列法:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
按如上圖排列好,再將非主副對(duì)角線上的各個(gè)數(shù)關(guān)于中心對(duì)調(diào),即成下圖:
1 15 14 4
12 6 7 9
8 10 11 5
13 3 2 16
4M+2階幻方的求解方法
加邊法
以6階為例子,先排出4階的幻方,如上圖,再將圖中每一個(gè)數(shù)都加上8m + 2 = 10
11 25 24 14
22 16 17 19
18 20 21 15
23 13 12 26
在外圍加上一圈格子,把和這些數(shù)安排在外圈格子內(nèi),把1到8M+2和4m*4m+8m+3到(4m+2)*(4m+2)安排到外圈格子內(nèi),但要使相對(duì)兩數(shù)之和等于16m(m + 1) + 5。
有了這些公式算法,我們就可以用程序語言來實(shí)現(xiàn)它了
首先,這是一個(gè)十階的幻方也就是說我們要用4M+2階幻方的模式來實(shí)現(xiàn)他,其中M=2;
并且要先求出4*2也就是8階幻方,在把
下面是我編的C語言算法:
#include "stdio.h"
void mian()
{
int arr[10][10];
int no=1;
for(int i=1;i9;i++)
{
for(int j=1;j9;j++)
{
arr[i][j]=no;
no++;
}
}
for(int i=1;i5;i++)
{
for(int j=1;j9;j++)
{
if(i=j||i=(9-j))
contine;
else
{
int need=0;
need=arr[i][j];
arr[i][j]=arry[9-i][9-j];
arry[9-i][9-j]=need;
}
}
}
for(int i=1;i9;i++)
{
for(int j=1;j9;j++)
{
arr[i][j]=arr[i][j]+18;
}
}
int a[18],b[18];
int q=1,w=83;
for(int i=0;i18;i++)
{
a[i]=q;
b[i]=w;
q++;
w++;
}
for(int i=1;i9;i++)
{
for(int j=1;j9;j++)
{
if(j=8)
printf("%d\n",arr[i][j]);
else
printf("%d",arr[i][j])
}
}
for(int i=0;i18;i++)
{
printf("%d\n",a[i]);
printf("%d\n",b[i]);
}
}
因?yàn)槲覜]有C編譯器,所以我就只有這樣把沒檢驗(yàn)過的代碼給你了,我說明一下,我這個(gè)編譯的是8*8的二維數(shù)組的幻方,公式也給你了,也許答案和你的不一樣,但是絕對(duì)是正確的,樓主可以驗(yàn)算,至于為什么我沒有加上其他二方,那是因?yàn)槲視簳r(shí)還沒有想到有更優(yōu)化的方法來實(shí)現(xiàn)4M+2種類的幻方方法,只能把他剩下的二方數(shù)字輸出來,讓別人自己填,我也就能做到這樣了,打了大半天,雖說不完美,但是也只有將就了
另外,虛機(jī)團(tuán)上產(chǎn)品團(tuán)購,超級(jí)便宜
當(dāng)前文章:填幻方的Java代碼,Java幻方
當(dāng)前地址:http://chinadenli.net/article13/dsshods.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、外貿(mào)網(wǎng)站建設(shè)、建站公司、移動(dòng)網(wǎng)站建設(shè)、品牌網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)