一中OJ #1194 數獨 | 回溯 + 搜索 | 解題報告

一中OJ | #1194 數獨

時限 1000MS/Case 內存 64MB/Case




題目描述

數獨是一個風靡全球的解謎遊戲。它的規則如下:
在一個9*9的方格中,有一些位置上已經填有數字。你需要把1~9填寫到空格當中,並且使用方格的每一行,每一列中包含1~9這九個數字。同時還要保證,空格中用粗線劃分的9個3*3的方格也同時包含1~9這九個數字。下圖是一個數獨的樣例:


現在給出一個數獨,請你找出它的解。

輸入格式

輸入數據一共9行,每行有9個字符。
輸入數據描述了一個待解決的數獨,其中,“?”表示數獨中的空缺。
我們的輸入數據總保證有唯一解。

輸出格式

輸出一共9行,每行9個數字,表示你的答案。

樣例輸入

5????7??6
?6????5?4
?834?????
???182?4?
??1???9??
?7?369???
?????543?
1?5????9?
7??2????1

樣例輸出

514927386
967831524
283456179
659182743
321574968
478369215
892615437
135748692
746293851

數據範圍

輸入的數據保證答案唯一。

----------------------------------------------------------

題目分析

這道題的話...看上去其實不難吧

總之回溯慢慢搜就好了,用bool數組來保證行,列,3*3區域裏的數的唯一性

----------------------------------------------------------

代碼

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <set>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#define hashsize 1000003
#define inf 0x7f7f7f7f
using namespace std;
bool ok;
bool r[10][10]={false},c[10][10]={false},f[4][4][10]={false};
int sudoku[10][10]={0};
char ch[25]={0};
void run(int x,int y)//即將填(x,y) 
{
	if(x==9)
	{
		for(int i=0;i<9;i++)
		{
			for(int j=0;j<9;j++) printf("%d",sudoku[i][j]);
			printf("\n");
			ok=1;
		}
		return;
	}
	if(sudoku[x][y]!=0)
	{
		if(y==8)
		run(x+1,0);
		else
		run(x,y+1);
		return;
	}
	for(int z=1;z<=9;z++)
	{
		if(r[x][z]==false && c[y][z]==false && f[x/3][y/3][z]==false)
		{
			sudoku[x][y]=z;
			r[x][z]=true;
			c[y][z]=true;
			f[x/3][y/3][z]=true;
			if(y==8)
			run(x+1,0);
			else
			run(x,y+1);
			if(ok) return;
			sudoku[x][y]=0;
			r[x][z]=false;
			c[y][z]=false;
			f[x/3][y/3][z]=false;
		}
	}
	return;
}
void init()
{
	for(int x=0;x<9;x++)
	{
		scanf("%s",ch);
		for(int y=0;y<9;y++)
		if(ch[y]!='?')
		{
			int j=ch[y]-'0';
			sudoku[x][y]=j;
			r[x][j]=c[y][j]=f[x/3][y/3][j]=true;
		}
	}
}
void work()
{
	init();
	run(0,0);
	return;
}
int main()
{
	work();
	return 0;
}


發佈了23 篇原創文章 · 獲贊 15 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章