本帖最後由 b1081081 於 2010-11-14 10:35 編輯
基於對社會大眾有著愛民愛己的心,在此破例破解士豪的程式碼給大家
不要說我無情 倒是可以說我白目(ㄏㄏ)
對於士豪的刪除程式碼的行為 對我來說有跟沒有一樣= =(好囂張)
程式碼如下:- /* 判斷一個九宮格數字是不是一個數獨的正解 */
- #include <iostream>
- #include <cstdlib>
- using namespace std;
- int main(void){
- const int x = 9; //數獨大小 x*x
- int a[x][x], b[x][x];
- int total, no;
- while (true){
- total = 0;
- no = 0;
- /* 開始儲存9 * 9陣列的值 */
- for (int i = 0; i < x; i++){
- for (int j = 0; j < x; j++){
- if (cin >> a[i][j])
- ;
- else
- goto END;
- }
- }
- /* 開始檢查每一列是否有重複之值 1+...+9應等於45 */
- for (int i = 0; i < x; i++){
- for (int j = 0; j < x; j++){
- total += a[i][j];
- }
- if (total != 45){ //若!=45表示有重複之數字
- no++;
- }
- total = 0; //每次檢查完將 total 歸零
- }
- /* 在將陣列的行列交換 */
- for (int i = 0; i < x; i++){
- for (int j = 0; j < x; j++){
- b[j][i] = a[i][j];
- }
- }
-
- /* 開始檢查每一行是否有重複之值 1+...+9應等於45 */
- for (int i = 0; i < x; i++){
- for (int j = 0; j < x; j++){
- total += b[i][j];
- }
- if (total != 45){ //若!=45表示有重複之數字
- no++;
- }
- total = 0; //每次檢查完將 total 歸零
- }
- /* 開始檢查九宮格裡是否有重複之值 1+...+9應等於45 */
- for (int i = 0; i < 9; i+=3){
- for (int j = 0; j < 9; j+=3){
- for (int x = i; x < i+3; x++){
- for (int y = j; y < j+3; y++){
- total += a[x][y];
- }
- }
- if(total != 45){
- no++;
- }
- total = 0; //每次檢查完將 total 歸零
- }
- }
- /* 最後判斷 no 的值 */
- if (no > 0){
- cout << "no" << endl;
- }else{
- cout << "yes" << endl;
- }
- }
- //system("pause");
- END:
- return 0;
- }
複製代碼 但是本人認為寫的不甚完美 所以寫了一個更精簡的版本 並把理由寫在註解的地方
程式碼如下:- /* 判斷一個九宮格數字是不是一個數獨的正解 */
- #include <iostream>
- #include <cstdlib>
- using namespace std;
- int main(void){
- const int x = 9; //數獨大小 x*x
- int a[x][x];//這裡並不需要用到兩個陣列 原因 請自行看第19~29行
- int total,total2, no;
- while (true){
- total = 0; total2 = 0;//多用一個的原因 請自行看第19~29行
- no = 0;
- /* 這裡並不需要用到IF,士豪多用了 */
- for (int i = 0; i < x; i++){
- for (int j = 0; j < x; j++){
- cin >> a[i][j];
- }
- }
- /* 沒有必要多用四個FOR迴圈 兩個就可以搞定了 */
- for (int i = 0; i < x; i++){
- for (int j = 0; j < x; j++){
- total += a[i][j];
- total2 += a[j][i];
- }
- if (total != 45 || total2 != 45){ //若!=45表示有重複之數字
- no++;
- }
- total = 0; //每次檢查完將 total 歸零
- total2 = 0;
- }
- /* 這裡寫的很好 我原本也要這樣寫 */
- for (int i = 0; i < 9; i+=3){
- for (int j = 0; j < 9; j+=3){
- for (int x = i; x < i+3; x++){
- for (int y = j; y < j+3; y++){
- total += a[x][y];
- }
- }
- if(total != 45){
- no++;
- }
- total = 0; //每次檢查完將 total 歸零
- }
- }
- /* 這裡OK */
- if (no > 0){
- cout << "no" << endl;
- }else{
- cout << "yes" << endl;
- }
- }
- //system("pause");
- //沒必要用到 goto 更難看而已
- return 0;
- }
複製代碼 OFCOURS 本人當然有跑過 確定無誤(廢話)
大家自行比較吧!! |