poj2676Sudoku

来源:互联网 发布:蚁群算法公式解析 编辑:程序博客网 时间:2024/05/29 21:30
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
1103000509002109400000704000300502006060000050700803004000401000009205800804000107
Sample Output
143628579572139468986754231391542786468917352725863914237481695619275843854396127
#include<iostream>#include<string.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 i,int j){    int test;    cin>>test;    while(test--)    {        memset(row,false,sizeof(row));        memset(col,false,sizeof(col));        memset(grid,false,sizeof(grid));        char MAP[10][10];        for(i=1;i<=9;i++)            for(j=1;j<=9;j++)            {                cin>>MAP[i][j];                map[i][j]=MAP[i][j]-'0';                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++)                cout<<map[i][j];            cout<<endl;        }    }    return 0;}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 面包车打不起火怎么办 汽车电瓶亏电怎么办 小车电池没电怎么办 汽车电瓶有电打不着火怎么办 汽车电瓶没电打不着火怎么办 汽车电池没电打不着火怎么办 汽车电瓶亏电打不着火怎么办 自动挡电瓶没电打不着火怎么办 自动挡车子没电打不着火怎么办 自动挡汽车没电打不着火怎么办 自动挡汽车有电打不着火怎么办 p0846骐达故障怎么办 汽车冷却液漏了怎么办 冷却液管子漏了怎么办 电脑网络不可用怎么办 手表带子坏了怎么办 这几天生意不好怎么办 大学不想住宿舍怎么办 在北京买车后被骗怎么办 联通套餐不到期怎么办 联通全国流量包怎么办 缤智车钥匙丢了怎么办 车遮阳板松了怎么办 洗车把内饰划了怎么办 新车销售没销量怎么办 住院时间重叠了怎么办 长安cs75油耗高怎么办 墙内线烧了怎么办 如果没买票想进高铁站怎么办 老赖拒绝还款怎么办 gta5资产不兼容怎么办 平板黑屏闪退怎么办 施工证学历不够怎么办 隧道放炮声大怎么办 58工作被骗了怎么办 学历国家不承认怎么办 福州居住证一年到期怎么办 居住证过期2年怎么办 被房东坑了怎么办 房东违反了合同怎么办 上海居住证过期了怎么办