伊莉討論區
標題:
數獨
[打印本頁]
作者:
andrew33673367
時間:
2014-3-13 12:52 AM
標題:
數獨
本帖最後由 andrew33673367 於 2014-3-14 12:41 AM 編輯
輸入的每一組測試資料均為 9 × 9 的矩陣,且全部為 1~9 的數字,每兩組九宮格之間以一空行作為分隔
輸出說明 :
yes or no
範例輸入 :
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
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
範例輸出 :
no
yes
以下是我的程式碼,怎麼跑都是yes;
#include <iostream>
#include <cmath>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
int i,j,k,n,c,d;
int z,x,h;
void aaa();
int st[9][9];
int m[9];
int main()
{
c=0;
for(d=0;d<9;d++){
m[d]=0;
}
for(z=0;z<9;z++){
for(x=0;x<9;x++){
cin>>st[z][x];
}
}
aaa();
for(h=0;h<9;h++){
if(m[h]>=2){
cout<<"no";
return 0;
}
}
cout<<"yes";
return 0;
}
void aaa()
{
for(i=0;i<9;i+=3){
for(j=0;j<9;j+=3){
for(k=i;k<3;k++){
for(n=j;n<3;n++){
if(st[0][0]==st[k][n]){
m[c]=m[c]+1;
}
}
}
c=c+1;
}
}
}
複製代碼
請問是哪裡有問題??
作者:
皇臾
時間:
2014-3-13 08:15 AM
提示:
作者被禁止或刪除 內容自動屏蔽
作者:
EdisonX
時間:
2014-3-13 12:40 PM
**********************************************************************************/
/* Problem: a016 "數獨(SUDOKU)" */
/* Language: C (844 Bytes) */
/* Result: AC(2ms, 240KB) judge by zeroserver@ZeroJudge */
/* Author: edisonx at 2011-07-11 16:43:34 */
/**********************************************************************************/
#include <stdio.h>
int table[9][9];
int checkrow_col();
int check_block();
int check();
int main()
{
int i, j;
while(scanf("%d", &table[0][0])==1){
for(i=1; i!=9; ++i) scanf("%d", &table[0][i]);
for(i=1; i!=9; ++i)
for(j=0; j!=9; ++j) scanf("%d", &table[i][j]);
puts( (check() ? "yes" : "no"));
}
return 0;
}
int check()
{
if(checkrow_col()) return check_block();
return 0;
}
int checkrow_col()
{
int i, j, cnt1, cnt2;
for(i=0; i!=9; ++i){
for(cnt1=cnt2=j=0; j!=9; ++j)
cnt1+=table[i][j], cnt2+=table[j][i];
if(cnt1!=45 || cnt2!=45) return 0;
}
return 1;
}
int check_block()
{
int i, j, k, l, cnt;
for(i=0; i!=9; i+=3){
for(j=0; j!=9; j+=3){
for(k=cnt=0; k!=3; ++k)
for(l=0; l!=3; ++l) cnt+=table[i+k][j+l];
if(cnt!=45) return 0;
}
}
return 1;
}
複製代碼
作者:
EdisonX
時間:
2014-3-13 02:15 PM
改了一下,不用偷雞方式,這樣就沒問題了,而且速度更快。
/**********************************************************************************/
/* Problem: a016 "數獨(SUDOKU)" */
/* Language: C (905 Bytes) */
/* Result: AC(0ms, 280KB) judge by this@ZeroJudge */
/* Author: edisonx at 2014-03-13 14:14:20 */
/**********************************************************************************/
#include <stdio.h>
int table[9][9];
int checkrow_col();
int check_block();
int check();
int main()
{
int i, j;
while(scanf("%d", &table[0][0])==1){
for(i=1; i!=9; ++i) scanf("%d", &table[0][i]);
for(i=1; i!=9; ++i)
for(j=0; j!=9; ++j) scanf("%d", &table[i][j]);
puts( (check() ? "yes" : "no"));
}
return 0;
}
int check()
{
if(checkrow_col()) return check_block();
return 0;
}
int checkrow_col()
{
int i, j;
unsigned rst1=0 , rst2=0;
for(i=0; i!=9; ++i){
for(rst1=rst2=j=0; j!=9; ++j)
rst1|=(1U<<table[i][j]), rst2|=(1U<<table[j][i]);
if(rst1!=0x3FE || rst2!=0x3FE) return 0;
}
return 1;
}
int check_block()
{
int i, j, k, l;
unsigned rst;
for(i=0; i!=9; i+=3){
for(j=0; j!=9; j+=3){
for(k=rst=0; k!=3; ++k)
for(l=0; l!=3; ++l) rst|=(1U<<table[i+k][j+l]);
if(rst!=0x3FE) return 0;
}
}
return 1;
}
複製代碼
作者:
abz53378
時間:
2014-3-16 02:02 AM
提示:
作者被禁止或刪除 內容自動屏蔽
作者:
EdisonX
時間:
2014-3-16 05:41 AM
本帖最後由 EdisonX 於 2014-3-16 05:41 AM 編輯
abz53378 發表於 2014-3-16 02:02 AM
請問一下 1U
這裡要以二進制來看。
(1) 1U << n
左移 n 個 bit,假設 n = 4 的話, 1U<<4 ,二進位得到 1 0000,翻成十進位得到 16
(2) rst | (1U<<n)
將 rst 第 n 個 bit 設成 1。
-----------
所以整體而言,rst | = (1U<<table[ i ][j] ) ; 是在判斷 table[ i ][j] 是不是剛好出現 1~9,如果 table[ i ] 裡的 1~9 都出現過的話, rst 的二進位剛好會是 11 1111 1110,這個值翻成 16 進位就是 0x3FE。用這種方式判別顯得較省力。
歡迎光臨 伊莉討論區 (http://www2.eyny.com/)
Powered by Discuz!