POJ-2676-Sudoku-DFS

来源:互联网 发布:管家婆软件创业版 编辑:程序博客网 时间:2024/06/04 18:13

题意:每行每列每个九空格数字不同,输出一种符合题意即可

思路:

DFS&暴力

正着搜跑560,反着16ms;和这个题相似的题3074,数据厉害,这个代码过不了

#include<stdio.h>#include<string.h>#include<stdlib.h>int mp[10][10];int mx[10][10];int my[10][10];int mk[10][10];int cp;struct node///需要填的空{    int x; int y;}ls[85];int dfs(int st){    int i, j;   if(st == cp)   {       for(i = 0; i < 9; i++)       {           for(j = 0; j < 9; j++)           {               printf("%d",mp[i][j]);           }           printf("\n");       }       return 2;   }   int flag = 0;   for(i = 1; i <= 9; i++)   {       int x = ls[st].x;       int y = ls[st].y;       int k=3*((x)/3)+(y)/3+1;       if(!mx[x][i]&&!my[y][i]&&!mk[k][i])       {           mp[x][y] = i;           mx[x][i] = 1;           my[y][i] = 1;           mk[k][i] = 1;           flag = dfs(st+1);           if(flag == 2)            return 2;///满足条件,不再继续           mp[x][y] = 0;           mx[x][i] = 0;           my[y][i] = 0;           mk[k][i] = 0;       }   }}int main(){    int t;    scanf("%d",&t);    while(t--)    {        memset(mx,0,sizeof(mx));        memset(my,0,sizeof(my));        memset(mk,0,sizeof(mk));        int i, j;        cp = 0;        for(i = 0; i < 9; i++)        {            char c[15];            scanf("%s",c);            for(j = 0; j < 9; j++)            {                mp[i][j] = c[j]-'0';                if(mp[i][j] == 0)                {                    ls[cp].x = i;                    ls[cp].y = j;                    cp++;                }                int k=3*(i/3)+j/3+1;                mx[i][mp[i][j]] = 1;///每行出现过的数字                my[j][mp[i][j]] = 1;///每列出现过的数字                mk[k][mp[i][j]] = 1;///每个3X3的九宫格出现过的数字            }        }        dfs(0);    }    return 0;}


0 0
原创粉丝点击