码迷,mamicode.com
首页 > 其他好文 > 详细

NYOJ 722 数独

时间:2015-04-29 15:19:36      阅读:171      评论:0      收藏:0      [点我收藏+]

标签:acm

这个之前也做过,不过就是,求出一种解法之后就退出了

可以很方便的改成找出所有解的形式


数独

时间限制: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>

using namespace std;

int sudoku[9][9];

//判断填在空白位置的数字在行、列上是否符合要求
bool Judge1(int x, int y, int n)
{
	int i;

	for(i=0;i<9;i++)
	{
		//判断 列
		if((sudoku[i][y]==n) && (i!=x))
			return false;
		//判断 行
		if((sudoku[x][i]==n) && (i!=y))
			return false;
	}

	return true;
}

//判断填在空白位置的数字在九宫格之内是否符合要求
bool Judge2(int x, int y, int n)
{
	int xx,yy,i,j;
	xx=x/3;
	yy=y/3;
	for(i=xx*3;i<xx*3+3;i++)
		for(j=yy*3;j<yy*3+3;j++)
			if(sudoku[i][j]==n)
				if(i==x && j==y)
					continue;
				else
					return false;
	return true;
}

//填充空白数组
bool Fill(int m)
{
	int n,x,y;
	x=m/9;
	y=m%9;
	if (m>=81)
		return true;
	if (sudoku[x][y]==0)
	{
		for(n=1;n<=9;n++)
		{
			sudoku[x][y]=n;
			if(Judge1(x,y,n)&&Judge2(x,y,n))
				if(Fill(m+1))
					return true;
			sudoku[x][y]=0;

		}
	}
	else
		return Fill(m+1);

	return false;
}


int main()
{
	int n,i,j,k;
	cin>>n;
	while(n--)
	{
		memset(sudoku,0,sizeof(sudoku));
		for(i=0;i<9;i++)
			for(j=0;j<9;j++)
				cin>>sudoku[i][j];
		if(Fill(0))
		{
			for(i=0;i<9;i++)
			{
				for(j=0;j<9;j++)
					cout << sudoku[i][j] << " ";
				cout << endl;
			}
		}
	}
	return 0;
}


NYOJ 722 数独

标签:acm

原文地址:http://anglecode.blog.51cto.com/5628271/1640266

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!