1. 程式人生 > >Java基礎3——檢查數獨的解決方案是否正確,兩種方法

Java基礎3——檢查數獨的解決方案是否正確,兩種方法

/**
數獨是一個9x9網格,被分為9個3x3的塊。
將1~9輸入格子裡,使每行每列及每塊都包含1~9九個數字。
檢查數獨的解決方案是否正確有兩種方法:
方法1:檢查是否每行每列每塊都有1~9;
方法2:檢查每個單元格,數字必須是1~9,且該數字在每行每列每塊都是唯一的。
 */

/*有效的數獨
9 6 3 1 7 4 2 5 8
1 7 8 3 2 5 6 4 9
2 5 4 6 8 9 7 3 1
8 2 1 4 3 7 5 9 6
4 9 6 8 5 2 3 1 7
7 3 5 9 6 1 8 2 4
5 8 9 7 1 3 4 6 2
3 1 7 2 4 6 9 8 5
6 4 2 5 9 8 1 7 3
 */

import java.util.Scanner;

public class CheckSudokuSolution {

	public static void main(String[] args) {
		//讀取數獨解決方案
		int[][] grid=readASolution();
		//列印結果
		System.out.println("方法1:"+(isValid1(grid)?"Valid Solution":
			"Invalid Solution"));
		System.out.println("方法2:"+(isValid2(grid)?"Valid Solution":
			"Invalid Solution"));
	}
	
	//從控制檯讀取數獨解決方案
	public static int[][] readASolution(){
		Scanner input=new Scanner(System.in);
		
		System.out.println("Enter a Sudoku puzzle solution:");
		int[][] grid=new int[9][9];
		for(int i=0;i<9;i++)
			for(int j=0;j<9;j++)
				grid[i][j]=input.nextInt();
		return grid;
	}
	
	//方法1:

	//將每列數字儲存至一個二維陣列,通過將橫縱座標交換
	public static int[][] column(int[][] grid){
		int[][] c=new int[9][9];
		for(int i=0;i<9;i++)
			for(int j=0;j<9;j++)
				c[i][j]=grid[j][i];
		return c;
	}
	
	//將每塊的數字儲存至一個二維陣列
	public static int[][] block(int[][] grid){
		int[][] b=new int[9][9];
		for(int i=0;i<9;i++)
			for(int j=0;j<9;j++){
				//將數獨從左至右從上至下分為9塊,求該單元格屬於第幾塊,將該塊數字儲存至b第幾行
				int rowOfB=i/3*3+j/3;
				//每塊有9個數字,求該數字屬於第幾個,儲存至b第幾列
				int columnOfB=i%3*3+j%3;
				b[rowOfB][columnOfB]=grid[i][j];
			}
		
		/*檢查塊數字轉變為二維陣列的每一行,是否正確
		for(int row=0;row<9;row++){
			for(int col=0;col<9;col++)
				System.out.print(b[row][col]+" ");
			System.out.println( );
		}
		*/	
		 
		return b;
	}
	
	//檢查一個長度為9的陣列是否只包含1~9
	public static boolean checkNumber1(int[] matrix){
		//宣告一個包含9個元素的陣列,每個元素都初始化為0
		int[] temp=new int[9];
		for(int i=0;i<9;i++)
			temp[i]=0;
		
		for(int i=0;i<9;i++){
		//檢查matrix的每個元素是否在1~9之間,如果是,則將temp的第matrix[i]-1個數字置為1
		//當且僅當temp每個數字均為1時,matrix的元素包含1~9的每個數字
			if(matrix[i]>0&&matrix[i]<10)
				temp[matrix[i]-1]=1;
		}
		
		for(int i=0;i<9;i++){
		//如果temp不全為1,則返回false
			if(temp[i]!=1)
				return false;
		}
		return true;
	}
	
	//檢查一個9*9的二維陣列每行是否只含1~9
	public static boolean checkNumber2(int[][] secMatrix){
		for(int i =0;i<9;i++)
			if(!checkNumber1(secMatrix[i])) 
				return false;
		return true;
	}
	
	public static boolean isValid1(int[][] grid){
		//檢查每行數字是否都有1~9
		if(!checkNumber2(grid)) return false;
		
		//檢查每列數字是否都有1~9
		int[][] columnMatrix=column(grid);
		if(!checkNumber2(columnMatrix)) return false;
		
		//檢查每塊數字是否都有1~9
		int[][] blockMatrix=block(grid);
		if(!checkNumber2(blockMatrix)) return false;
		
		return true;
	}
	
	//方法2:
	public static boolean isValid2(int[][] grid){
		//依次檢查每個單元格的數字是否在1~9之間,及該數字在每行每列每塊是否唯一
		for(int i=0;i<9;i++)
			for(int j=0;j<9;j++)
				if(grid[i][j]<1||grid[i][j]>9||!isOnly(grid,i,j))
					return false;
		return true;
	}
	
	public static boolean isOnly(int[][] grid,int i,int j){
		//檢查每行中該數字是否唯一
		for(int col=0;col<9;col++)
			if(col!=j&&grid[i][col]==grid[i][j])
				return false;
		
		//檢查每列中該數字是否唯一
		for(int row=0;row<9;row++)
			if(row!=i&&grid[row][j]==grid[i][j])
				return false;
		
		//檢查每塊中該數字是否唯一
		for(int row=i/3*3;row<i/3*3+3;row++)
			for(int col=j/3*3;col<j/3*3+3;col++){
				if(row!=i&&col!=j&&grid[row][col]==grid[i][j])
					return false;
			}
		
		return true;
	}
}

相關推薦

Java基礎3——檢查解決方案是否正確方法

/** 數獨是一個9x9網格,被分為9個3x3的塊。 將1~9輸入格子裡,使每行每列及每塊都包含1~9九個數字。 檢查數獨的解決方案是否正確有兩種方法: 方法1:檢查是否每行每列每塊都有1~9; 方法2:檢查每個單元格,數字必須是1~9,且該數字在每行每列每塊都是唯一的。

Mysql使用binlog恢復解決誤操作問題的方法

tle osi net 回滾 href bsp databases affect 恢復 為保證沒有其他參數配置影響,重新安裝配置了一臺最小化安裝的CentOS7虛擬機 1. 基礎知識? 安裝mysql5.6數據庫Mysql binlog初步理解 2. 配置mysql 開啟

vue+django跨域問題解決方案(前後端方案

1.Vue前端設定代理(方案一) 我們在使用vue-cli啟動專案的時候npm run dev便可以啟動我們的專案了,通常我們的請求地址是以localhost:8080來請求介面資料的,localhost是沒有辦法設定cookie的。  我們可以在vu

Java基礎知識複習(八)-- 遍歷ArrayList的三方法

第一種遍歷 普通for迴圈 可以用size()和get()分別得到大小,和獲取指定位置的元素,結合for迴圈就可以遍歷出ArrayList的內容 第二種遍歷,使用迭代器 從最開始的位置判斷"下一個"位置是否有資料,如果有就通過next取出來,並且把指標向

SA:T1編寫主函法和T2Matlab自帶的SA工具箱GUI法方法實現對二元函優化求解——Jason niu

lin plot itl 最優解 IT 主函數 alt 圖片 gui %SA:T1法利用Matlab編寫主函數實現對定義域[-5,5]上的二元函數求最優解—Jason niu [x,y] = meshgrid(-5:0.1:5,-5:0.1:5); z = x.^2 +

java graphics drawline (make line bold, 使線變粗方式)

class ArcsPanel extends JPanel {     protected void paintComponent(Graphics g) {      super.paintComp

初學Java多執行緒:從執行緒返回資料的方法

從執行緒中返回資料和向執行緒傳遞資料類似。也可以通過類成員以及回撥函式來返回資料。但類成員在返回資料和傳遞資料時有一些區別,下面讓我們來看看它們區別在哪。 一、通過類變數和方法返回資料 使用這種方法返回資料需要在呼叫start方法後才能通過類變數或方法得到資料。讓我們先來看

Java小程式之句子每個單詞首字母大寫(方法

題目:用Java編寫一個將輸入的英文句子每個單詞首字母變為大寫的小程式。 程式碼如下: 檔名:CapitalizeTheFirstLetter.java public class CapitalizeTheFirstLetter { /**

apache+php完美解決301重定向的方法

<?php $the_host = $_SERVER['HTTP_HOST']; $request_uri = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : ''; switch ($the_host) { case "www.

Android apk安裝過程及Java、JNI讀取安裝包內assets資原始檔的方法(附原始碼例項)

問題背景:在PC上的程式可以輕鬆使用./或不用指明,預設讀取的就是程式所在路徑內的檔案。但在Android上,應用程式被打包成apk,程式執行時無法直接獲取apk(壓縮包)內的檔案。但在一些特殊場合,如載入影象處理訓練好的分類器、模型等資料,要求每個apk到手機上都能執行,就

java 中去除字串中的空格方法

/** * 去除字串中的所有空格 * @author Administrator * */ public class StringTo { public static void main(String[] args) { /** * 第一種方法 Stri

Java程式碼中獲取配置檔案(config.properties)中內容的方法

方法千千萬,本人暫時只總結了兩種方法。 (1) config.properties中的內容如圖 在applicationContext.xml中配置 <!-- 引入配置檔案 --> <bean id="configProperties" cl

jqueryURL中引數中解決中文亂碼問題的方法

一、正則分析法function GetQueryString(name) {     var reg = new RegExp("(^|&)" + name + "=([^&]*)(&a

java 判斷對象是否是某個類的類型方法

判斷 如果 一個 ava 布爾值 als 布爾 子類 null 第一種: instanceof 運算符是用來在運行時指出對象是否是特定類的一個實例。instanceof通過返回一個布爾值來指出,這個對象是否是這個特定類或者是它的子類的一個實例。 用法: result

Dynamic Web Module 3.1 requires Java 1.7 or newer. 錯誤解決方案

pom.xml文件 artifact logs per group -s conf 你會 cti 在寫代碼的時候工程出現了這樣奇怪的bug很是蛋疼啊,經過查詢解決方法,終於解決了這些個問題。 下面是解決問題的方法,和大家分享一下 (1)確定你的java工程配置使用了java

java基礎3

java基礎1.二維數組 定義:元素為一維數組的數組。 動態初始化方式一(指定有多少個長度相同的一維數組): 數據類型[][] 變量名 = new 數據類型[m][n]; m表示有多少個一維數組 n表示一維數組中有多少個元素 動態初始化方式二

Day3 - Python基礎3、遞歸、內置函

輸出 proc 內存 roc -- python 一個 重復 spa 1.函數基本語法及特性 函數是什麽? 函數一詞來源於數學,但編程中的「函數」概念,與數學中的函數是有很大不同的,具體區別,我們後面會講,編程中的函數在英文中也有很多不同的叫法。在BASIC中叫做subro

Step3- Python基礎3、遞歸、內置函

方法 efi brush 內置 logs python 基本語法 內置函數 關鍵字 一、函數基本語法及特性 Python中函數的定義方法: def test(x): #定義函數的關鍵字,()內可定義形參 "The function definitions" #文檔

Python基礎3、遞歸、內置函

python 函數本節內容1. 函數基本語法及特性2. 參數與局部變量3. 返回值嵌套函數4.遞歸5.匿名函數6.函數式編程介紹7.高階函數8.內置函數溫故知新1. 集合主要作用: 去重關系測試, 交集\差集\並集\反向(對稱)差集>>> a = {1,2,3,4} >>>

hive加載json解決方案

lena bash 文件 min blog ash eve 視圖 題解 hive官方並不支持json格式的數據加載,默認支持csv格式文件加載,如何在不依賴外部jar包的情況下實現json數據格式解析,本編博客著重介紹此問題解決方案 首先創建元數據表: create EX