將你其中某些問題的答案放在代碼注釋中了.
創(chuàng)新互聯(lián)建站自2013年創(chuàng)立以來(lái),先為綏德等服務(wù)建站,綏德等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為綏德企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
這個(gè)程序輸出的是固定的九宮格,我想,是根據(jù)固有的九宮格中的數(shù)字與數(shù)組下標(biāo)的關(guān)系來(lái)寫的代碼。
希望對(duì)你有所幫助,加油!
class?S{
public?static?void?main(String[]?args)?{?
int?arr[][]?=?new?int[3][3];?
//創(chuàng)建一個(gè)三階方陣??
int?a?=?2;????????
//第3行的行下標(biāo)
//???這里是什么意思,2從何而來(lái)
//A:java中數(shù)組的下標(biāo)從0開始
int?b?=?3/2;????
//第2列的列下標(biāo)
//???同上?
//A:這里由于b=1,(int)/(int),java中數(shù)組的下標(biāo)從0開始
for(int?i=1;i=9;i++){??
//給數(shù)組賦值???
arr[a++][b++]?=?i;??
if(i%3==0){?????
//如果i是3的倍數(shù)——————???為什么要判斷是不是3的倍數(shù)?
a?=?a-2;
//————————————————???if...else里面的語(yǔ)句是什么意思,作用是什么???
b?=?b-1;//————————————————???同上??
}
//使a,b回到起點(diǎn):a=2,b=1;
else{???????
//如果i不是3的倍數(shù)//————————————————???同上????
a?=?a%3;???
b?=?b%3;???
}??
}
//????九宮格的每一行、每一列、對(duì)角線都等于15,
//???但是這里連一個(gè)15這個(gè)數(shù)字都沒有出現(xiàn),但還是成功輸出
//————————————————————???他是怎么做到的?
System.out.println("輸出九宮格:");???
//遍歷輸出九宮格??
for(int?i=0;i3;i++){?
for(int?j=0;j3;j++){??
System.out.print(arr[i][j]+"??");?
}
System.out.print("\n");//從你的程序中將此語(yǔ)句上移到此位置?
}
}
}
/*
九宮格算法代碼 C++版
*/
#include stdio.h
int map[9][9] = {0, 0, 3, 8, 1, 0, 0, 0, 9,
5, 0, 0, 4, 0, 0, 0, 8, 0,
0, 6, 0, 9, 0, 0, 1, 0, 0,
0, 0, 8, 0, 3, 0, 0, 0, 6,
0, 0, 0, 0, 0, 0, 0, 0, 0,
9, 0, 0, 6, 0, 0, 5, 0, 0,
0, 0, 6, 0, 0, 9, 0, 1, 0,
0, 1, 0, 0, 0, 5, 0, 0, 4,
2, 0, 0, 0, 4, 8, 7, 0, 0};
void display()
{
int i;
int j;
for (i = 0; i 9; i++)
{
for (j = 0; j 9; j++)
{
if(map[i][j])
{
printf(" %d ", map[i][j]);
}
else
{
printf(" ");
}
}
printf("\n");
}
}
int check(int x, int y, int *mark) //check函數(shù)為該格子可以選擇的數(shù)字
{
int i;
int j;
int gi;
int gj;
int count = 0;
for (i = 1; i = 9; i++)
{
mark[i] = 0; //初始化
}
for (i = 0; i 9; i++)
{
mark[map[x][i]] = 1; //表示該行該數(shù)字已存在
mark[map[i][y]] = 1; //表示該列該數(shù)字已存在
}
gi = x / 3 * 3; // 九宮格把map分割成9個(gè)小塊,如果該格子所在行列為(1,4),那么它所在子格子起始為(0,3)到(2,5)的九個(gè)小格子
gj = y / 3 * 3;
for (i = 0; i 3; i++)
{
for (j = 0; j 3; j++)
{
mark[map[gi + i][gj + j]] = 1; //此循環(huán)為表示所在子格子的九個(gè)小格子中已存在該數(shù)字
}
}
for (i = 1; i = 9; i++)
{
if(0 == mark[i]) //如果該數(shù)字不存在則++
{
count++;
}
}
return count;
}
void crack() //??
{
int i;
int j;
int mark[10]; //標(biāo)志數(shù)字是否已存在
int min = 10; //記錄最少可能數(shù)字?jǐn)?shù)
int ci = -1; //ci,cj用來(lái)記錄最少可能數(shù)字的格子所在行列
int cj;
for (i = 0; i 9; i++)
{
for (j = 0; j 9; j++)
{
if (map[i][j])
{
continue; //如果該格子已有數(shù)字則跳到下一個(gè)格子
}
int c = check(i, j, mark); //c為該格子可以選擇的數(shù)字
if (0 == c)
{
return;
}
if (c min)
{
ci = i;
cj = j;
min = c;
}
}
}
if (-1 == ci)
{
printf("The answer is:\n");
display();
return;
}
check(ci, cj, mark);//這個(gè)語(yǔ)句的作用是把mark這個(gè)數(shù)組設(shè)置成最小可能格子缺少的數(shù)字,若缺少則為0
for (i = 1; i = 9; i++)
{
if (mark[i] == 0)
{
map[ci][cj] = i; //先填入該數(shù)字
crack(); //進(jìn)行判斷
}
map[ci][cj] = 0; //若這個(gè)數(shù)字不可以得到解則判斷下一可能數(shù)字(這里類似0-1背包問題)
}
}
int main()
{
printf("The game is:\n");
display();
crack();
return 0;
}
/*直接復(fù)制運(yùn)行就可以,每一行的九個(gè)數(shù)字代表一個(gè)九宮格的9個(gè)數(shù)字,從左到右,從上到下*/
import?java.util.ArrayList;
import?java.util.Arrays;
public?class?Test1?{
private?static?ArrayListString?arrangeList?=?new?ArrayListString();?
?public?static?void?main(String[]?args)?{
String?str?=?"123456789";//你要排列組合的字符串
char?list[]?=?str.toCharArray();//將字符串轉(zhuǎn)換為字符數(shù)組
genernateData(list,?0,?list.length?-?1);//參數(shù)為字符數(shù)組和0和字符數(shù)組最大下標(biāo)
int?arr[]=new?int[9];
for(String?str1?:?arrangeList){
for(int?k=0;k9;k++){
arr[k]=Integer.parseInt(str1.substring(k,k+1));
}
if(arr[0]+arr[1]+arr[2]==15arr[3]+arr[4]+arr[5]==15arr[6]+arr[7]+arr[8]==15arr[0]+arr[3]+arr[6]==15arr[1]+arr[4]+arr[7]==15arr[2]+arr[5]+arr[8]==15arr[0]+arr[4]+arr[8]==15arr[2]+arr[4]+arr[6]==15){
System.out.println(Arrays.toString(arr));
}
}
}
?
public?static?void?genernateData(char?list[],?int?k,?int?m)?{
?if?(k??m)?{
?StringBuffer?sb?=?new?StringBuffer();//創(chuàng)建一個(gè)StringBuffer對(duì)象sb
?for?(int?i?=?0;?i?=?m;?i++)?{
?sb.append(list[i]);//循環(huán)將字符數(shù)組值追加到StringBuffer中
?}
?arrangeList.add(sb.toString());
?}?else?{
?for?(int?i?=?k;?i?=?m;?i++)?{
?swapData(list,?k,?i);//將下表為k和i的值調(diào)換位置
?genernateData(list,?k?+?1,?m);
?swapData(list,?k,?i);
?}
?}
}
private?static?void?swapData(char?list[],?int?k,?int?i)?{
char?temp?=?list[k];
list[k]?=?list[i];
list[i]?=?temp;
}
}