南陽ACM 題目722 數獨

    數獨

時間限制:1000 ms  |  內存限制:65535 KB
難度:4
描述

         數獨是一種運用紙、筆進行演算的邏輯遊戲。玩家需要根據9×9盤面上的已知數字,推理出所有剩餘空格的數字,並滿足每一行、每一列、每一個3*3宮內的數字均含1-9,不重複。 每一道合格的數獨謎題都有且僅有唯一答案,推理方法也以此爲基礎,任何無解或多解的題目都是不合格的。

       有一天hrdv碰到了一道號稱是世界上最難的數獨的題目,作爲一名合格的程序員,哪能隨隨便便向困難低頭,於是他決定編個程序來解決它。。


輸入
第一行有一個數n(0< n <100),表示有n組測試數據,每組測試數據是由一個9*9的九宮格構成,0表示對應的格子爲空
輸出
輸出一個9*9的九宮格,爲這個數獨的答案
樣例輸入
1
0 0 5 3 0 0 0 0 0
8 0 0 0 0 0 0 2 0
0 7 0 0 1 0 5 0 0
4 0 0 0 0 5 3 0 0
0 1 0 0 7 0 0 0 6
0 0 3 2 0 0 0 8 0
0 6 0 5 0 0 0 0 9
0 0 4 0 0 0 0 3 0
0 0 0 0 0 9 7 0 0
樣例輸出
1 4 5 3 2 7 6 9 8
8 3 9 6 5 4 1 2 7
6 7 2 9 1 8 5 4 3
4 9 6 1 8 5 3 7 2
2 1 8 4 7 3 9 5 6
7 5 3 2 9 6 4 8 1
3 6 7 5 4 2 8 1 9
9 8 4 7 6 1 2 3 5
5 2 1 8 3 9 7 6 4
#include<iostream>
#include<cstring>
#include<fstream>
using namespace std;
int map[9][9];//原始圖
int vis1[9][10];//row
int vis2[9][10];//col
int vis3[9][10];//宮
bool dfs(int i,int j)
{
   if(i==8&&j==8)
   {int k;
   for( k=1;k<=9&&vis3[8][k];k++);
   if(k<=9) map[i][j]=k;
   return true;}
   if(map[i][j])
   {
   	if(j<8){ if(dfs(i,j+1)) return true;}
   	else if(i<8&&dfs(i+1,0))   return true; 
   }
   else
   {
   	int m=3*(i/3)+j/3;//計算屬於哪個宮 
   	int i1=i,j1=j;
   		if(j<8) j1=j+1;
     	else if(i<8)  i1=i+1,j1=0;
   for(int k=1;k<=9;k++)
   {
   	if(!vis1[i][k]&&!vis2[j][k]&&!vis3[m][k])
   	{
   		vis1[i][k]=vis2[j][k]=vis3[m][k]=1;
   		map[i][j]=k;
   		if(dfs(i1,j1))   return true;
		vis1[i][k]=vis2[j][k]=vis3[m][k]=0; 
		map[i][j]=0;		
	   }
   }
  }
    return false;
 } 
 int main()
 {
 	//freopen("in.txt","r",stdin);
 	//freopen("out.txt","w",stdout);
 	int T;
 	cin>>T;
 	while(T--){
 		memset(vis1,0,sizeof(vis1));
 		memset(vis2,0,sizeof(vis2));
 		memset(vis3,0,sizeof(vis3));
 	for(int i=0;i<9;i++)
 	   for(int j=0;j<9;j++){
 	   cin>>map[i][j];
 	   int m=3*(i/3)+j/3;
 	   if(map[i][j]) vis1[i][map[i][j]]=1,vis2[j][map[i][j]]=1,vis3[m][map[i][j]]=1;
 }
    dfs(0,0);
    	for(int i=0;i<9;i++){
 	   for(int j=0;j<9;j++)
 	   cout<<map[i][j]<<" ";
 	   cout<<endl;}
 }
 	   return 0;
 }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章