您的位置:首页 > 其它

POJ-2676-Sudoku-DFS

2015-08-20 15:07 204 查看
题意:每行每列每个九空格数字不同,输出一种符合题意即可

思路:

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: