#9935: 又出現 SE ?


p3a_owhj (阿普二信)

學校 : 不指定學校
編號 : 39897
來源 : [36.227.79.178]
最後登入時間 :
2024-06-04 22:09:36
b053. 4. 數獨遊戲 -- 96學年度高雄市資訊學科能力競賽 | From: [49.159.135.172] | 發表日期 : 2015-06-20 15:44

/*
d263 ,  b053 sudo
本程式在 d263 可 AC 但在 b053 吃  *** SE !!!
*/
#include <iostream>
using namespace std;
const int MaxN = 3*3;
int sudo[MaxN][MaxN];
int n , m;  // 輸入的 n 、 m=n*n
bool yes; // 是否有找到  

bool chk(int r, int c)
{
   // sudo[r][c]  所加入的數字是否合規定?
   int i, j, r0, c0;
   for(i=0; i<m; ++i)  //檢查橫列
   {
if(i==c) continue;
if( sudo[r][c] == sudo[r][i] ) return false;
}
   for(i=0; i<m; ++i)  //檢查直行
   {
if(i==r) continue;
if( sudo[r][c] == sudo[i][c] ) return false;
}

r0 = r/n*n;  c0 = c/n*n; //檢查小九宮
for(i=0;i<n;++i)
 for(j=0;j<n;++j)
 {
if(r==r0+i && c==c0+j) continue;
if( sudo[r][c] == sudo[r0+i][c0+j] ) return false;
}
// 皆過關
return true;
}

void dfs(int r, int c)
{
  // sudo[r][c]  r,c若已填完最後一格,則 印出
  int i,j,k;
  r += c/m;   c%=m;
  if(r==m) //都填入了
  {
for(i=0;i<m;++i)
{
cout << sudo[i][0];
  for(j=1;j<m;++j)
    cout << " " << sudo[i][j];
  cout << endl;
}
yes = true;
return;
}
else if( sudo[r][c] )
{
//此格已填,若原數字符合,則下一格
if( chk(r,c) )  dfs(r, c+1);
return ;
}
else
{
for( k=1; k<=m; ++k)  // 填入 1 ~ n^2 ,
{
sudo[r][c] = k;
if( chk(r,c) ) dfs(r, c+1); // 檢查是否可填入,可的話往下一格 dfs(r , c+1 )
if(yes) return;
}
sudo[r][c] = 0; // 此格不過,改回 0
}
}
int main()
{
  int r,c;
  bool first=true;
while( cin >> n )
{
if(first) first = false; else cout << endl;
if(n==0) { cout << "NO SOLUTION" << endl; continue; }
m = n*n;  // m 為 n^2 : n=2即 4x4 、 n=3 即 9x9
  for(r=0; r<m; ++r)
  for(c=0; c<m; ++c)
 cin >> sudo[r][c];
 
yes = false;
dfs( 0 , 0 ); //由 (0,0)格 每一格填入 1 ~ n^2 試

  if(!yes) cout << "NO SOLUTION" << endl;
}
  return 0;
}
/* 輸入範例 ---
2
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1

1
0

2
0 3 0 0
4 0 0 0
1 0 0 0
0 0 2 0

2
2 3 4 0
0 4 0 0
1 0 2 0
0 2 0 3

3
0 6 0 1 0 4 0 5 0
0 0 8 3 0 5 6 0 0
2 0 0 0 0 0 0 0 1
8 0 0 4 0 7 0 0 6
0 0 6 0 0 0 3 0 0
7 0 0 9 0 1 0 0 4
5 0 0 0 0 0 0 0 2
0 0 7 2 0 6 9 0 0
0 4 0 5 0 8 0 7 0

3
3 6 0 1 9 4 7 5 8
4 1 8 0 7 5 6 2 9
2 7 0 0 8 0 4 1 3
8 3 1 4 5 7 2 9 6
9 5 4 8 6 2 1 3 7
7 2 6 9 0 3 5 8 4
5 9 3 7 0 1 8 6 2
1 8 7 2 3 6 9 4 5
6 4 2 5 0 8 3 7 1
輸出 ------------------
NO SOLUTION

1

2 3 1 4
4 1 3 2
1 2 4 3
3 4 2 1

NO SOLUTION

9 6 3 1 7 4 2 5 8
1 7 8 3 2 5 6 4 9
2 5 4 6 8 9 7 3 1
8 2 1 4 3 7 5 9 6
4 9 6 8 5 2 3 1 7
7 3 5 9 6 1 8 2 4
5 8 9 7 1 3 4 6 2
3 1 7 2 4 6 9 8 5
6 4 2 5 9 8 1 7 3

NO SOLUTION
*/

 
ZeroJudge Forum