poj 2676 如何填满九宫格

Sudoku

Time Limit: 2000 MS Memory Limit: 65536 KB

64-bit integer IO format: %I64d , %I64u Java class name: Main

Special Judge

[Submit] [Status] [Discuss]

Description

Sudoku is a very simple task. A square table with 9 rows and 9 columns is divided to 9 smaller squares 3x3 as shown on the Figure. In some of the cells are written decimal digits from 1 to 9. The other cells are empty. The goal is to fill the empty cells with decimal digits from 1 to 9, one digit per cell, in such way that in each row, in each column and in each marked 3x3 subsquare, all the digits from 1 to 9 to appear. Write a program to solve a given Sudoku-task.

Input

The input data will start with the number of
the test cases. For each test case, 9 lines follow, corresponding to the
rows of the table. On each line a string of exactly 9 decimal digits is
given, corresponding to the cells in this line. If a cell is empty it
is represented by 0.

Output

For each test case your program should print
the solution in the same format as the input data. The empty cells have
to be filled according to the rules. If solutions is not unique, then
the program may print any one of them.

Sample Input

1
103000509
002109400
000704000
300502006
060000050
700803004
000401000
009205800
804000107

Sample Output

143628579
572139468
986754231
391542786
468917352
725863914
237481695
619275843
854396127
#include<iostream>
#include <string.h>
#include <stdio.h>

using namespace std;

int map[10][10]; //九宫格

bool row[10][10];    //row[i][x]  标记在第i行中数字x是否出现了
bool col[10][10];    //col[j][y]  标记在第j列中数字y是否出现了
bool grid[10][10];   //grid[k][x] 标记在第k个3*3子格中数字z是否出现了

//(这里说明的字母不代表下面程序中的变量)

bool DFS(int x,int y)  ///从左到右  上到下
{
    if(x==10)
        return true;

    bool flag=false;

    if(map[x][y])
    {
        if(y==9)  ///右边界的列
            flag=DFS(x+1,1);
        else
            flag=DFS(x,y+1);

        if(flag)  //回溯
            return true;
        else
            return false;
    }
    else
    {

        int k=3*((x-1)/3)+(y-1)/3+1;

        for(int i=1; i<=9; i++) //枚举数字1~9填空
            if(!row[x][i] && !col[y][i] && !grid[k][i])
            {
                map[x][y]=i;

                row[x][i]=true;
                col[y][i]=true;
                grid[k][i]=true;

                if(y==9)
                    flag=DFS(x+1,1);
                else
                    flag=DFS(x,y+1);

                if(!flag)   //回溯,继续枚举
                {
                    map[x][y]=0;

                    row[x][i]=false;
                    col[y][i]=false;
                    grid[k][i]=false;
                }
                else
                    return true;
            }
    }
    return false;
}

int main()
{
    int t;
    int i,j;
    cin>>t;
    while(t--)
    {

        char MAP[10][10];
        for(i=1; i<=9; i++)
        {
            for(j=1; j<=9; j++)
            {
                //scanf("%c",&map[i][j]);
                cin>>MAP[i][j];
                map[i][j]=MAP[i][j]-‘0‘;
            }

        }
        memset(row,false,sizeof(row));
        memset(col,false,sizeof(col));
        memset(grid,false,sizeof(grid));
        for(int i=1; i<=9; i++)
        {
            for(int j=1; j<=9; j++)
            {
                if(map[i][j])
                {
                    int k=3*((i-1)/3)+(j-1)/3+1;
                    row[i][ map[i][j] ]=true;
                    col[j][ map[i][j] ]=true;
                    grid[k][ map[i][j] ]=true;
                }
            }
        }

        DFS(1,1);

        for(i=1; i<=9; i++)
        {
            for(j=1; j<=9; j++)
               printf("%d",map[i][j]);
               printf("\n");
        }
    }
    return 0;
}

poj 2676 如何填满九宫格

时间: 2024-11-03 01:22:01

poj 2676 如何填满九宫格的相关文章

poj 2676 Sudoku (基础DFS)

Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15456   Accepted: 7574   Special Judge Description Sudoku is a very simple task. A square table with 9 rows and 9 columns is divided to 9 smaller squares 3x3 as shown on the Figure.

POJ 2676 Sudoku (数独)

经典搜索问题,主要是时间上的优化,我用了三个辅助数组记录信息 row[i][k] = 1表示第i行数字k已经被使用,col[j][k] = 1表第j列数字k已经被使用,blo[i][k]表示第i个小九宫格中数字k已经被使用 还有很重要的一个优化(没有优化的话可能会超时,或者非常慢,像POJ讨论区里有很多说正着搜超时,倒着搜0ms,这的确是一个可以用的方法,但是有一定的随机性),每次填数字时,先扫描一遍整个矩阵,找出可选数字情况最少的那个0所在的地方,优先填这里,这样会使得搜索树尽可能的"瘦&qu

poj 2676 Sudoku (dfs)

链接:poj 2676 题意:给定一个未完成的数独,0是待填位置,其他均为已填入的数字.如果能将其 补充完整,则输出补充完整的数独(有多组答案输出任意一组),否则原样输出 数独:一个9行9列的网格,包括9个3*3的子网格,要求每行.每列.每个子网格内 都只能使用一次1-9中的一个数字, 即每行.每列.每个子网格内都不允许出现相同的数字. 分析:对于每一个未填的格,依次判断它所在行.列.子网格是否填了1-9, 若都未填,先填上该值,继续搜索, 若无法填写了,再回溯,填上其他可能的值,继续搜索 看别

POJ 2676 Sudoku (搜索,Dancing Links)

题目: http://poj.org/problem?id=2676 题意: 数独,每行1-9,每列1-9,每3*3小格1-9,填数,不能重复 方法:Dancing Links(16ms)或者DFS暴搜(400-900ms) Dancing Links(DLX) 是为了解决矩阵精确覆盖问题的算法,算法效率非常高 使用DLX解决的问题必须转化为矩阵精确覆盖问题: 1.DLX详解: http://wenku.baidu.com/view/d8f13dc45fbfc77da269b126.html 2

POJ 2676 数独

题意: 给你一个9*9的未完成的数独,将其填完 思路: 暴搜 从第一个位置搜起,有数字就直接跳过搜下一个位置,没数字就填数字 .通过行,列,九宫格不能重复填数,把能填的数填进去就可以了 //By DXY 2018.04.27 #include<iostream> #include<cmath> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm>

POJ 2676 数码问题DLX

Sudoku Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13023   Accepted: 6455   Special Judge Description Sudoku is a very simple task. A square table with 9 rows and 9 columns is divided to 9 smaller squares 3x3 as shown on the Figure.

(搜索) poj 2676

M - Sudoku Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 2676 Description Sudoku is a very simple task. A square table with 9 rows and 9 columns is divided to 9 smaller squares 3x3 as shown on

ext:grid分页,列宽度自动填满grid宽度

var cm = new Ext.grid.ColumnModel([{      header : '编号',      dataIndex : 'id'     }, {      header : '名称',      dataIndex : 'name'     }, {      header : '描述',      dataIndex : 'descn'     }]);   var store = new Ext.data.Store({      proxy : new Ext

li 水平排列并自动填满 ul

找了li 如何水平排列并自动填满 ul,同时 li 宽度平均?资料,里面有提到"请用js动态计算保证兼容性", 因为我想实现的是,水平滚动条,ul的上级div是固定的宽度1000px, 我就想到用jquery 获取每个li的高度,ul的宽度等于每个li的宽度. 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DT