標題:
a016: 數獨(SUDOKU)
[打印本頁]
作者:
Alen
時間:
2010-11-13 12:59
標題:
a016: 數獨(SUDOKU)
題目連結
/* 判斷一個九宮格數字是不是一個數獨的正解 */
#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++){
.
.
.(部分程式碼)
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];
}
.
.
.(部分程式碼)
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];
}
}
.
.
.
(部分程式碼)
total = 0; //每次檢查完將 total 歸零
}
}
/* 最後判斷 no 的值 */
if (no > 0){
cout << "no" << endl;
}else{
cout << "yes" << endl;
}
}
//system("pause");
END:
return 0;
}
複製代碼
作者:
buy
時間:
2010-11-13 16:24
恭喜士豪率先解出~
作者:
b1081081
時間:
2010-11-14 10:31
本帖最後由 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 本人當然有跑過 確定無誤(廢話)
大家自行比較吧!!
作者:
p17johnny
時間:
2010-11-14 17:43
竟然變成第3名了= = 恨阿~~~(小笨魚 不要一直做人身攻擊好嗎 沒品結)
//陳繹仁 製 !@#$%^&*()_+ 排版有點亂= = 請多包涵
#include <iostream>
#include <cstdlib>
using namespace std;
int main(void){
const int z=9;
int a[z][z];
int total,total2,no;
while (true){
total=0;total2=0;
no=0;
for (int i = 0; i < z; i++){
for (int j = 0; j < z; j++){
cin >> a[i][j];
}
}
for (int i=0;i<z;i++){
for (int j=0;j<z;j++){
total += a[i][j];
total2 += a[j][i];
}
if (total !=45 || total2 !=45){
no++;
}
total=0;
total2=0;
}
for (int i=0;i<9;i+=3){
for (int j=0;j<9;j+=3){
for (int z=i;z<i+3;z++){
for (int x=j;x<j+3;x++){
total+=a[z][x];
}
}
if(total !=45){
no++;
}
total=0;
}
}
if (no>0){
cout<<"no"<<endl;
}else{
cout<<"yes"<<endl;
}
}
system("pause");
return 0;
}
//!@#$%^&*()_+ 麻煩死了= = !@#$%^&*()_+
複製代碼
作者:
p17johnny
時間:
2010-11-14 17:50
怎麼辦~~一直都是逾時= =
怎麼辦啦 你們是怎用到成功ㄉ哩 怪怪哩 阿哩??
請幫幫偶~~
作者:
buy
時間:
2010-11-14 18:46
本帖最後由 buy 於 2010-11-14 18:48 編輯
呵呵~ 大家都不錯喔
譯仁程式碼會TLE嗎? 因為你沒有註解SYSTEMPAUSE?
作者:
b1081081
時間:
2010-11-15 23:26
破解別人的程式碼算不算犯法阿老師??
作者:
buy
時間:
2010-11-18 08:21
不算阿~ 是我請世豪貼上去的
看別人缺漏的程式碼寫出來也是一種訓練思考的方法
作者:
Alen
時間:
2010-12-4 08:19
我是 「士豪」!!!
歡迎光臨 種子論壇 | 高雄市資訊培育協會學員討論區 (http://seed.istak.org.tw/)
Powered by Discuz! 7.2