有效的数独
判斷一個(gè)?9x9 的數(shù)獨(dú)是否有效。只需要根據(jù)以下規(guī)則,驗(yàn)證已經(jīng)填入的數(shù)字是否有效即可。
上圖是一個(gè)部分填充的有效的數(shù)獨(dú)。
數(shù)獨(dú)部分空格內(nèi)已填入了數(shù)字,空白格用?'.'?表示。
?
示例?1:
輸入: [["5","3",".",".","7",".",".",".","."],["6",".",".","1","9","5",".",".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".",".","3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6"],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],[".",".",".",".","8",".",".","7","9"] ] 輸出: true示例?2:
輸入: [["8","3",".",".","7",".",".",".","."],["6",".",".","1","9","5",".",".","."],[".","9","8",".",".",".",".","6","."],["8",".",".",".","6",".",".",".","3"],["4",".",".","8",".","3",".",".","1"],["7",".",".",".","2",".",".",".","6"],[".","6",".",".",".",".","2","8","."],[".",".",".","4","1","9",".",".","5"],[".",".",".",".","8",".",".","7","9"] ] 輸出: false 解釋: 除了第一行的第一個(gè)數(shù)字從 5 改為 8 以外,空格內(nèi)其他數(shù)字均與 示例1 相同。但由于位于左上角的 3x3 宮內(nèi)有兩個(gè) 8 存在, 因此這個(gè)數(shù)獨(dú)是無效的。說明:
- 一個(gè)有效的數(shù)獨(dú)(部分已被填充)不一定是可解的。
- 只需要根據(jù)以上規(guī)則,驗(yàn)證已經(jīng)填入的數(shù)字是否有效即可。
- 給定數(shù)獨(dú)序列只包含數(shù)字?1-9?和字符?'.'?。
- 給定數(shù)獨(dú)永遠(yuǎn)是?9x9?形式的。
這道題不難,關(guān)鍵是知道 二維數(shù)組的分布規(guī)律就行
?
我解決的比較暴力? 下面是代碼。
兩種思路,一種犧牲 內(nèi)存換時(shí)間,創(chuàng)建3 個(gè)列表 來存 上面規(guī)定的3種規(guī)則。遇到數(shù)字就存進(jìn)去,進(jìn)去前判斷是否以及飽含了,沒包含就 存 進(jìn)去 有包含 就返回false;
規(guī)律比較難尋的是 9個(gè) 3*3的小矩陣。
摸索下還是可以找到的。
public bool IsValidSudoku(char[,] board) { //思路2 3個(gè)列表 //思路1for(int i=0;i<9;i++){for(int j=0;j<9;j++){for(int k=0;k<9;k++){// 行 比較if (board[i,j]!='.'&&board[i,j]==board[i,k]&&j!=k){ return false;}//列的比較if (board[j,i]==board[k,i]&&j!=k&&board[k,i]!='.'){ Console.Write(board[j,i]);return false;} }}}List<char> vs = new List<char>(); //左三個(gè)for (int i = 0; i < 9; i++){ for (int j = 0; j <3; j++){if(board[j, i]!='.'){if(vs.Contains(board[j, i])){return false;}else{vs.Add(board[j, i]);}}}if ((i + 1) % 3 == 0){vs.Clear();}}//中三個(gè) for (int i = 0; i < 9; i++){for (int j = 3; j < 6; j++){if(board[j, i]!='.'){if(vs.Contains(board[j, i])){return false;}else{vs.Add(board[j, i]);}}}if ((i + 1) % 3 == 0){vs.Clear();}}//右三個(gè) for (int i = 0; i < 9; i++){for (int j = 6; j < 9; j++){if(board[j, i]!='.'){if(vs.Contains(board[j, i])){return false;}else{vs.Add(board[j, i]);}}}if ((i + 1) % 3 == 0){vs.Clear();}}return true;}?
后來又遇到這個(gè)題目,又有了第二版...簡(jiǎn)潔了不少.
public bool IsValidSudoku(char[][] board) {int[] numsRow =new int[9];int[] numsColumn = new int[9];int[][] numsGrids = new int[][]{new int[9],new int[9],new int[9],};for (int y= 0; y <9; y++) // 1 ~ 9{for (int x = 0; x <9; x++) //1~9{if (board[y][x]!='.'){if (! CheckNums(board, numsRow, y, x)){return false;}//numsRow}if (board[x][y]!= '.'){if (!CheckNums(board, numsColumn, x, y)){return false;}}int index = (x) / 3;if (board[y][x] != '.'){if (!CheckNums(board, numsGrids[index], y, x)){return false;} }if ((y+1)%3==0&&(x+1)%3==0){numsGrids[index] = new int[9];}//計(jì)算清空 時(shí)機(jī)}numsRow = new int[9];numsColumn = new int[9];//進(jìn)行 清空}return true;}bool CheckNums(char[][] board,int [] numsRow, int y,int x){int index = (int)board[y][x] - 49;if (numsRow[index] == 1){return false;}numsRow[index] = 1;return true;}?
總結(jié)
- 上一篇: 计算机拼音字体大小设置,怎样调整字体大小
- 下一篇: 修改Tomcat端口号