数独问题—题解

你一定听说过“数独”游戏。

如【图1.png】,玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。

数独的答案都是唯一的,所以,多个解也称为无解。

本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕易如反掌了。

本题的要求就是输入数独题目,程序输出数独的唯一解。我们保证所有已知数据的格式都是合法的,并且题目有唯一的解。

格式要求,输入9行,每行9个字符,0代表未知,其它数字为已知。

输出9行,每行9个数字表示数独的解。

例如:

输入(即图中题目):

005300000

800000020

070010500

400005300

010070006

003200080

060500009

004000030

000009700

程序应该输出:

145327698

839654127

672918543

496185372

218473956

753296481

367542819

984761235

521839764

再例如,输入:

800000000

003600000

070090200

050007000

000045700

000100030

001000068

008500010

090000400

程序应该输出:

812753649

943682175

675491283

154237896

369845721

287169534

521974368

438526917

796318452

资源约定:

峰值内存消耗 < 256M

CPU消耗  < 2000ms

解题思路:  数据量小,回溯法的效率是可观的。

import java.util.Scanner;

/**
 *
 *
 *   数独游戏
 *
 测试数据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
测试数据2:
8 0 0 0 0 0 0 0 0
0 0 3 6 0 0 0 0 0
0 7 0 0 9 0 2 0 0
0 5 0 0 0 7 0 0 0
0 0 0 0 4 5 7 0 0
0 0 0 1 0 0 0 3 0
0 0 1 0 0 0 0 6 8
0 0 8 5 0 0 0 1 0
0 9 0 0 0 0 4 0 0

 *
 */

public class Main
{
	public static boolean flag = false;   // 标记是否已找到

    public static void main(String[] args)
	{
		Scanner sc = new Scanner(System.in);
        int arr[][] = new int [10][10];
        for (int i = 1; i < arr.length; i++)
        for (int j = 1; j < arr[i].length; j++)
             arr[i][j] = sc.nextInt();
        sc.close();

        dfs(1, 1, arr);
	}

	private static void dfs(int x, int y, int[][] arr)
	{
		if (flag)  return ;

		if (x > 9)
		{
			output(arr); flag = true;
			return ;
		}
	    if (y > 9)
	    {
	    	dfs(x+1, 1, arr);
	    }
	    else if (arr[x][y] != 0) dfs(x,y+1,arr);
	    else
	    {
	    	for (int i = 1; i < 10; i++)
	    	{
	    		if (check(x, y, i, arr))
	    		{
	    			arr[x][y] = i;
	    			dfs(x, y+1, arr);
	    			arr[x][y] = 0;
	    		}
	    	}
	    }
	}

	private static boolean check(int x, int y, int num, int[][] arr)
	{
		// 检查x轴
		for (int i = 1; i < 10; i++)
		{
			if (arr[x][i] == num) return false;
		}
		// 检查y轴
		for (int i = 1; i < 10; i++)
		{
			if (arr[i][y] == num) return false;
		}
		// 检查九宫格
         for (int i = (x-1)/3*3+1; i <= (x-1)/3*3+3; i++)
         {
        	 for (int j = (y-1)/3*3+1; j <= (y-1)/3*3+3; j++)
        	 {
        		 if (arr[i][j] == num) return false;
        	 }
         }
		return true;
	}

	private static void output(int[][] arr)
	{
		 for (int i = 1; i < arr.length; i++)
		 {
			 for (int j = 1; j < arr[i].length; j++)
			 {
				System.out.print(arr[i][j] + " ");
			 }
			 System.out.println();
		 }
	}
}

时间: 2024-10-10 22:22:50

数独问题—题解的相关文章

提高组刷题营 DAY 1 下午

DFS 深度优先搜索 通过搜索得到一棵树形图 策略:只要能发现没走过的点,就走到它.有多个点可走就随便挑一个,如果无路可走就回退,再看有没有没走过的点可走. 在图上寻找路径[少数可用最短路解决]:最短路不能解决路径有顺序的,也就是如果路径的边权与之前经过的点火这路有关,那就只能深搜 解决递归形式的问题 有后效性的选择问题 组合问题 状态可能很多,因此数据范围一般较小 1.状态表示 2.剪枝 剪枝的方法: 最优答案剪枝 记忆化剪枝 可行性剪枝 …… 1.洪水[ 1s 32M ] 题解 数据范围小,

靶形数独 (codevs 1174)题解

[问题描述] 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z 博士请教,Z 博士拿出了他最近发明的“靶形数独”,作为这两个孩子比试的题目.靶形数独的方格同普通数独一样,在 9 格宽×9 格高的大九宫格中有9 个3 格宽×3 格高的小九宫格(用粗黑色线隔开的).在这个大九宫格中,有一些数字是已知的,根据这些数字,利用逻辑推理,在其他的空格上填入1 到9 的数字.每个数字在每个小九宫格内不能重复出现,

NOIP提高组 2009 靶形数独 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 此题解目前在洛谷上无法AC,只能拿到95分,使用洛谷的朋友请注意. 题目链接:  洛谷   CODEVS  Vijos 描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他 们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教, Z 博士拿出了他最近发明的“靶形数独” ,作为这两个孩子比试的题目. 靶形数独的方格同普通数独一样,在 9 格宽×9 格高的大九宫格中有 9

[NOIP2009]靶形数独 题解

407. [NOIP2009] 靶形数独 ★★   输入文件:sudoku.in   输出文件:sudoku.out   简单对比时间限制:5 s   内存限制:128 MB [问题描述] 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z博士请教,Z 博士拿出了他最近发明的“靶形数独” ,作为这两个孩子比试的题目. 靶形数独的方格同普通数独一样,在 9 格宽×9 格高的大九宫格中有 9 个 3 格

P1074 靶形数独题解

题目描述 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶形数独”,作为这两个孩子比试的题目. 靶形数独的方格同普通数独一样,在 9 格宽×9 格高的大九宫格中有9 个 3 格宽×3 格高的小九宫格(用粗黑色线隔开的).在这个大九宫格中,有一些数字是已知的,根据这些数字,利用逻辑推理,在其他的空格上填入 1 到 9的数字.每个数字在每个小九宫格内不能重复出

数独题解

#include <stdlib.h> #include <stdio.h> #define MAX_LEN 9 int sudoku[MAX_LEN][MAX_LEN] = { {5, 3, 0, 0, 7, 0, 0, 0, 0}, {6, 0, 0, 1, 9, 5, 0, 0, 0}, {0, 9, 8, 0, 0, 0, 0, 6, 0}, {8, 0, 0, 0, 6, 0, 0, 0, 3}, {4, 0, 0, 8, 0, 3, 0, 0, 1}, {7, 0, 0

bzoj3109 [cqoi2013]新数独

Description Input 输入一共15行,包含一个新数独的实例.第奇数行包含左右方向的符号(<和>),第偶数行包含上下方向的符号(^和v). Output 输出包含9行,每行9个1~9的数字,以单个空格隔开.输入保证解惟一. Sample Input < > > < > < v v ^ ^ v v ^ ^ ^< < > < > < ^ ^ ^ v ^ ^ ^ v v< < < < >

codevs2924 数独挑战

2924 数独挑战 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description “芬兰数学家因卡拉,花费3个月时间设计出了世界上迄今难度最大的数独游戏,而且它只有一个答案.因卡拉说只有思考能力最快.头脑最聪明的人才能破解这个游戏.”这是英国<每日邮报>2012年6月30日的一篇报道.这个号称“世界最难数独”的“超级游戏”,却被扬州一位69岁的农民花三天时间解了出来. 看到这个新闻后,我激动不已,证明我们OI的实力的机会来了,我们虽

【NOIP2009】靶形数独 DLX(Dancing Links)

[NOIP2009]靶形数独 T4 Time Limit: 2 Sec  Memory Limit: 128 MB Description 小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向Z 博士请教,Z 博士拿出了他最近发明的"靶形数独",作为这两个孩子比试的题目. 靶形数独的方格同普通数独一样,在 9 格宽×9 格高的大九宫格中有9 个3 格宽×3 格高的小九宫格(用粗黑色线隔开的).在