題目連結:a016: 數獨(SUDOKU)

JAVA 程式碼

//作者:骷骷
//網誌:http://bekachu.pixnet.net/blog

import java.util.Scanner;

public class JAVA {
	
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		while(sc.hasNext()){
			
			int[][] sudoku=new int[9][9];
			
			for(int i=0;i<9;i++){
				
				for(int j=0;j<9;j++){
					
					sudoku[i][j]=sc.nextInt();
				}
			}
			
			boolean t=true;
			
			L1:
			for(int i=0;i<9;i++){
				
				//檢查 列 是否重複
				//row:i column:j
				for(int j=1;j<9;j++){
					
					for(int k=j-1;k>=0;k--){
						
						if(sudoku[i][j]==sudoku[i][k]){
							
							t=false;
							break L1;
						}
					}
				}
				
				//檢查 欄 是否重複
				//column:i row:j
				for(int j=1;j<9;j++){
					
					for(int k=j-1;k>=0;k--){
						
						if(sudoku[j][i]==sudoku[k][i]){
							
							t=false;
							break L1;
						}
					}
				}
				
				//檢查每個小九宮格是否重複
				//
				//i:036
				//  147
				//  258
				//i 跑大九宮格 ( 1 個大九宮格有 81個值 )
				//
				//j:012
				//  345
				//  678
				//j 跑小九宮格 ( 1 個小九宮格有 9 個值 )				   
				for(int j=1;j<9;j++){
					
					for(int k=j-1;k>=0;k--){
						
						if(sudoku[i%3*3+j/3][j%3+i/3*3]==sudoku[i%3*3+k/3][k%3+i/3*3]){
							
							t=false;
							break L1;
						}
					}
				}
			}	
			
			if(t){
				
				System.out.println("yes");
			}else{
				
				System.out.println("no");
			}
		}	
		
		sc.close();
	}
}
/*測試資料:
1 2 3 4 5 6 7 8 9
2 3 4 5 6 7 8 9 1
3 4 5 6 7 8 9 1 2
4 5 6 7 8 9 1 2 3
5 6 7 8 9 1 2 3 4
6 7 8 9 1 2 3 4 5
7 8 9 1 2 3 4 5 6
8 9 1 2 3 4 5 6 7
9 1 2 3 4 5 6 7 8
no

1 9 3 2 6 5 4 7 8
7 8 2 3 1 4 9 5 6
4 5 6 9 7 8 1 3 2
2 3 4 8 5 1 6 9 7
9 6 5 4 3 7 2 8 1
8 7 1 6 9 2 3 4 5
3 1 9 5 8 6 7 2 4
5 2 7 1 4 3 8 6 9
6 4 8 7 2 9 5 1 3
yes
*/

==========

本來是在找 JAVA 有沒有 goto 的語法,

後來找到可以為迴圈命名,再 break 或 continue 迴圈名稱的用法,

感覺比 goto 語法高級的樣子。

 

判斷每個小九宮格是否重複的地方有點複雜,

最後還是被骷骷找到規律,破解掉啦。

arrow
arrow
    文章標籤
    JAVA a016 數獨(SUDOKU)
    全站熱搜

    骷骷 發表在 痞客邦 留言(2) 人氣()