當前位置:首頁 » 編程語言 » java數獨

java數獨

發布時間: 2022-03-01 09:10:19

1. java數獨游戲代碼

public class ShuDu {
/**存儲數字的數組*/
static int[][] n = new int[9][9];
/**生成隨機數字的源數組,隨機數字從該數組中產生*/
static int[] num = {1,2,3,4,5,6,7,8,9};
public static void main(String[] args) {
//生成數字
for(int i = 0;i < 9;i++){
//嘗試填充的數字次數
int time = 0;
//填充數字
for(int j = 0;j < 9;j++){
//產生數字
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,為下一次填充做准備
time = 0;
}else{ //繼續填充
//次數增加1
time++;
//繼續填充當前格
j--;
}
}
}
//輸出結果
for(int i = 0;i < 9;i++){
for(int j = 0;j < 9;j++){
System.out.print(n[i][j] + " ");
}
System.out.println();
}
}

/**
* 是否滿足行、列和3X3區域不重復的要求
* @param row 行號
* @param col 列號
* @return true代表符合要求
*/
public static boolean isCorret(int row,int col){
return (checkRow(row) & checkLine(col) & checkNine(row,col));
}

/**
* 檢查行是否符合要求
* @param row 檢查的行號
* @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 檢查的列號
* @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區域是否符合要求
* @param row 檢查的行號
* @param col 檢查的列號
* @return true代表符合要求
*/
public static boolean checkNine(int row,int col){
//獲得左上角的坐標
int j = row / 3 * 3;
int k = col /3 * 3;
//循環比較
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;
}

/**
* 產生1-9之間的隨機數字
* 規則:生成的隨機數字放置在數組8-time下標的位置,隨著time的增加,已經嘗試過的數字將不會在取到
* 說明:即第一次次是從所有數字中隨機,第二次時從前八個數字中隨機,依次類推,
* 這樣既保證隨機,也不會再重復取已經不符合要求的數字,提高程序的效率
* 這個規則是本演算法的核心
* @param time 填充的次數,0代表第一次填充
* @return
*/
public static int generateNum(int time){
//第一次嘗試時,初始化隨機數字源數組
if(time == 0){
for(int i = 0;i < 9;i++){
num[i] = i + 1;
}
}
//第10次填充,表明該位置已經卡住,則返回0,由主程序處理退回
if(time == 9){
return 0;
}
//不是第一次填充
//生成隨機數字,該數字是數組的下標,取數組num中該下標對應的數字為隨機數字
int ranNum = (int)(Math.random() * (9 - time));
//把數字放置在數組倒數第time個位置,
int temp = num[8 - time];
num[8 - time] = num[ranNum];
num[ranNum] = temp;
//返回數字
return num[8 - time];
}
}

2. 一個java解數獨的問題

可用遞歸方式來做,具體java代碼我就不寫了。
把格子從左上到右下排成64個,按次序每個做遍歷。
思路大概是這樣的:
function MakeAnswer(傳入父格子)
{
取父格子下的第一個子格子作為當前格子
計算當前格子所有可取的解

while (當前格子還有可取的未嘗試的解)
{
取一個這個當前格子未嘗試過的解,並把這個解標記成已嘗試
判斷是否這個當前格子已經是最後一個格子了,若是,則表示已經得到可行的解,則這個猜測是可行的,否則繼續遞歸 MakeAnswer(當前格子)
}
}

某個格子的嘗試的解改變了之後,往下遞歸子格子的時候,所有子格子的可能的解都有可能會變。

寫得比較抽象,不知你看懂沒

3. java高手進,求一個數獨游戲java代碼

數獨(sudoku)的生成與破解
最近在網上比較流行的智力游戲。筆者本人也玩過,可以下個模擬游戲試試,簡單的還可以,太難就無從下手了。雖然偶腦子不好使,但偶是計算機科班出身,怕你不成,老規矩,編程破解。

首先,偶是第一次做數獨的程序,可能程序不強,以後有時間再改進改進。望高手評析。

還是把數獨游戲的規則說一說吧,或許你是剛剛聽說這個名字的朋友。數獨(sudoku),起源於瑞士,於1970 年代由美國的一家數學邏輯游戲雜志首先發表,當時名為Number Place。及後在日本大力推廣下得以發揚光大,於1984 年取名「數獨」,即「獨立的數字」的省略,在一個9x9的方格中,有81個小方格組成,然後又分9個大塊,每塊由3x3的方格組成,就是中國的九宮圖,大九宮裡面再套9個小九宮,共九九八十一個小格子,游戲開始前會有一些格子上寫好了數,你需要在剩下的格子里填數,真到把所有格子填滿,並且要求,任何一行或一列或者一個小九宮中沒有相同的數字,當然你只能用1-9之間的9個數字

以下是java代碼,能幫我轉換成c++的嗎?(轉換成功再追加100分,謝謝了。)
Java code public class Sudoku { /** * Print the specified Sudoku problem and its solution. The * problem is encoded as specified in the class documentation * above. * * @param args The command-line arguments encoding the problem. */ public static void main(String[] args) { int[][] matrix = parseProblem(args); writeMatrix(matrix); if (solve(0,0,matrix)) // solves in place writeMatrix(matrix); else System.out.println("NONE"); } static boolean solve(int i, int j, int[][] cells) { if (i == 9) { i = 0; if (++j == 9) return true; } if (cells[i][j] != 0) // skip filled cells return solve(i+1,j,cells); for (int val = 1; val <= 9; ++val) { if (legal(i,j,val,cells)) { cells[i][j] = val; if (solve(i+1,j,cells)) return true; } } cells[i][j] = 0; // reset on backtrack return false; } static boolean legal(int i, int j, int val, int[][] cells) { for (int k = 0; k < 9; ++k) // row if (val == cells[k][j]) return false; for (int k = 0; k < 9; ++k) // col if (val == cells[i][k]) return false; int boxRowOffset = (i / 3)*3; int boxColOffset = (j / 3)*3; for (int k = 0; k < 3; ++k) // box for (int m = 0; m < 3; ++m) if (val == cells[boxRowOffset+k][boxColOffset+m]) return false; return true; // no violations, so it's legal } static int[][] parseProblem(String[] args) { int[][] problem = new int[9][9]; // default 0 vals for (int n = 0; n < args.length; ++n) { int i = Integer.parseInt(args[n].substring(0,1)); int j = Integer.parseInt(args[n].substring(1,2)); int val = Integer.parseInt(args[n].substring(2,3)); problem[i][j] = val; } return problem; } static void writeMatrix(int[][] solution) { for (int i = 0; i < 9; ++i) { if (i % 3 == 0) System.out.println(" -----------------------"); for (int j = 0; j < 9; ++j) { if (j % 3 == 0) System.out.print("| "); System.out.print(solution[i][j] == 0 ? " " : Integer.toString(solution[i][j])); System.out.print(' '); } System.out.println("|"); } System.out.println(" -----------------------"); } } -----------------------
| 4 3 | 7 | 9 8 |
| 5 | 3 | |
| 1 | | 3 |
-----------------------
| 6 | 2 7 | |
| 4 7 | | 1 3 |
| | 5 4 | 9 |
-----------------------
| 2 | | 3 |
| | 5 | 4 |
| 5 4 | 1 | 2 6 |
-----------------------
-----------------------
| 2 4 3 | 7 1 6 | 9 5 8 |
| 9 8 5 | 2 3 4 | 7 1 6 |
| 7 1 6 | 8 9 5 | 3 4 2 |
-----------------------
| 6 3 9 | 1 2 7 | 5 8 4 |
| 4 5 7 | 9 6 8 | 1 2 3 |
| 8 2 1 | 5 4 3 | 6 7 9 |
-----------------------
| 1 6 2 | 4 7 9 | 8 3 5 |
| 3 7 8 | 6 5 2 | 4 9 1 |
| 5 9 4 | 3 8 1 | 2 6 7 |
-----------------------

4. java數獨問題

數獨那東西好像有點復雜,可以說是9*9的一個框,橫豎以及每一個3*3的獨立小塊還不能有數字重復,代碼有點難辦啊。樓主不妨自己上網找一找代碼。

5. 創建數獨演算法 Java

用戶每填一個數字的時候你就判斷三次。
第一次,行判斷。第二次,列判斷,第三次,每個3×3的格子的判斷。

6. JAVA程序寫一個method,驗證一個數獨是否正確

publicstaticGeocache[]createGeocaches(inta){
if(a<=0)returnnewGeocache[0];

Randomrand=newRandom();

Geocache[]result=newGeocache[a];

for(inti=0;i<a;i++){
//因為題目沒有描述,這里假設x,y是隨機整數,Geocache有構造函數(int,int)

intx=rand.nextInt();

inty=rand.nextInt();

result[i]=newGeocache(x,y);

}

returnresult;

}

7. 求一個Java數獨程序

難度有點高 不過沒看清楚LZ什麼意思

8. java 數獨(性質求簡單代碼)

這只是一個找規律的題而已,找好規律了,誰都會做。

import java.util.Arrays;
import java.util.Scanner;
public class Kuaile {
public static void main(String[] args) {
System.out.println("請輸入一個>=34的數:");
Scanner in = new Scanner(System.in);
int num = in.nextInt();
while (num < 34) {
System.out.println("數值太小了!請重輸:");
num = in.nextInt();
}
int row1[] = { 8, 11, num - 20, 1 };
int row2[] = { num - 21, 2, 7, 12 };
int row3[] = { 3, num - 18, 9, 6 };
int row4[] = { 10, 5, 4, num - 19 };
System.out.println(Arrays.toString(row1));
System.out.println(Arrays.toString(row2));
System.out.println(Arrays.toString(row3));
System.out.println(Arrays.toString(row4));
}
}

9. 求用java寫一個數獨游戲

public class ShuDu {
/**存儲數字的數組*/
static int[][] n = new int[9][9];
/**生成隨機數字的源數組,隨機數字從該數組中產生*/
static int[] num = {1,2,3,4,5,6,7,8,9};
public static void main(String[] args) {
//生成數字
for(int i = 0;i < 9;i++){
//嘗試填充的數字次數
int time = 0;
//填充數字
for(int j = 0;j < 9;j++){
//產生數字
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,為下一次填充做准備
time = 0;
}else{ //繼續填充
//次數增加1
time++;
//繼續填充當前格
j--;
}
}
}
//輸出結果
for(int i = 0;i < 9;i++){
for(int j = 0;j < 9;j++){
System.out.print(n[i][j] + " ");
}
System.out.println();
}
}

/**
* 是否滿足行、列和3X3區域不重復的要求
* @param row 行號
* @param col 列號
* @return true代表符合要求
*/
public static boolean isCorret(int row,int col){
return (checkRow(row) & checkLine(col) & checkNine(row,col));
}

/**
* 檢查行是否符合要求
* @param row 檢查的行號
* @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 檢查的列號
* @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區域是否符合要求
* @param row 檢查的行號
* @param col 檢查的列號
* @return true代表符合要求
*/
public static boolean checkNine(int row,int col){
//獲得左上角的坐標
int j = row / 3 * 3;
int k = col /3 * 3;
//循環比較
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;
}

/**
* 產生1-9之間的隨機數字
* 規則:生成的隨機數字放置在數組8-time下標的位置,隨著time的增加,已經嘗試過的數字將不會在取到
* 說明:即第一次次是從所有數字中隨機,第二次時從前八個數字中隨機,依次類推,
* 這樣既保證隨機,也不會再重復取已經不符合要求的數字,提高程序的效率
* 這個規則是本演算法的核心
* @param time 填充的次數,0代表第一次填充
* @return
*/
public static int generateNum(int time){
//第一次嘗試時,初始化隨機數字源數組
if(time == 0){
for(int i = 0;i < 9;i++){
num[i] = i + 1;
}
}
//第10次填充,表明該位置已經卡住,則返回0,由主程序處理退回
if(time == 9){
return 0;
}
//不是第一次填充
//生成隨機數字,該數字是數組的下標,取數組num中該下標對應的數字為隨機數字
int ranNum = (int)(Math.random() * (9 - time));
//把數字放置在數組倒數第time個位置,
int temp = num[8 - time];
num[8 - time] = num[ranNum];
num[ranNum] = temp;
//返回數字
return num[8 - time];
}
}

10. JAVA 數獨問題

checkrow ()放在for (int r = 0 ; r < dim ; r++)
{
for (int c = 0 ; c < dim ; c++)
{
System.out.print (n [r] [c] + " ");
}
System.out.println ();
}
下面即可

熱點內容
大主宰腳本 發布:2025-01-11 14:40:56 瀏覽:826
ftp保存密碼是灰色 發布:2025-01-11 14:00:07 瀏覽:260
壓縮文件最好 發布:2025-01-11 13:59:58 瀏覽:648
有幾家java培訓機構 發布:2025-01-11 13:55:05 瀏覽:476
搭建個人伺服器缺點 發布:2025-01-11 13:54:13 瀏覽:376
怎麼用安卓的手機登錄ios第五人格 發布:2025-01-11 13:44:11 瀏覽:768
登陸Ftp重輸密碼 發布:2025-01-11 13:40:12 瀏覽:334
解壓神器有氧射擊 發布:2025-01-11 13:33:04 瀏覽:853
百度雲的好友在哪個文件夾 發布:2025-01-11 13:32:13 瀏覽:749
2級c語言試題 發布:2025-01-11 13:09:21 瀏覽:941