hdu 1426 数独, dfs

超时了,觉得是dfs那里错误了,不过用这段代码肯定可以算数独游戏我觉得,所以保存以后再看看吧



#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
#include<algorithm>
#include<cstring>
#include<cstdlib>
using namespace std;
const int LEN=10;
bool ma1[LEN][LEN], ma2[LEN][LEN], ma3[LEN][LEN];
bool ma[LEN][LEN][LEN];
char s[LEN][LEN];
int num;
bool flag=false, black;
typedef struct NODE
{
    int r, c;
}arrays;
arrays arr[LEN*LEN];
void display()
{
    if( black ) printf("\n");
    int i, j=1;
    for(i=1; i<LEN; i++)
    {
        j=1;
        printf("%c", s[i][j]);
        for(j=2; j<LEN; j++)
            printf(" %c", s[i][j]);
        printf("\n");
    }
//    printf("\n");
}
int getMa2ProcessSub(int i, int j)
{
    int r=1;
    if( i<=3 )
    {
        if( j<=3 ) r=1;
        else if( j<=6 ) r=2;
        else r=3;
    }else if( i<=6 )
    {
        if( j<=3 ) r=4;
        else if( j<=6 ) r=5;
        else r=6;
    }else
    {
        if( j<=3 ) r=7;
        else if( j<=6 ) r=8;
        else r=9;
    }
    return r;
}
void display2();
bool* tm, *tm1, *tm2;
void getMa1NotMarked(int r, int c)
{
    bool tm3[LEN], tm4[LEN];
    tm1=(bool*)malloc(LEN*sizeof(bool));
    if( tm1==NULL )
    {
        printf("malloc error\n");
        exit(0);
    }
    memset(tm1, true, LEN*sizeof(bool));
    memset(tm3, true, LEN*sizeof(bool));
    memset(tm4, true, LEN*sizeof(bool));
    for(int j=1; j<LEN; j++)
    {
        if( ma1[r][j]==false )
            tm3[j]=false;
    }
    for(int j=1; j<LEN; j++)
    {
        if( ma3[c][j]==false )
            tm4[j]=false;
    }
    for(int i=0; i<LEN; i++)
    {
        tm1[i]=tm3[i] | tm4[i];
       // printf("tm1[%d]=%d tm3=%d tm4=%d\n", i, tm1[i], tm3[i], tm4[i]);
    }
    //return tm;
}
void getMa2NotMarked(int i, int j)
{
    tm2=(bool*)malloc(LEN*sizeof(bool));
    if( tm2==NULL )
    {
        printf("malloc error\n");
        exit(0);
    }
    memset(tm2, true, LEN*sizeof(bool));
    int r=getMa2ProcessSub(i, j);
   // printf("r=%d\n", r);
    for(int j=1; j<LEN; j++)
    {
        if( ma2[r][j]==false )
            tm2[j]=false;
     //   printf("tm2[%d]=%d\n", j, tm2[j]);
    }
   // printf("ma2=%d\n", tm2);
    //return tm;
}
void getNotMarked(int r, int c)
{
    tm=(bool*)malloc(LEN*sizeof(bool));
    if( tm==NULL )
    {
        printf("malloc error\n");
        exit(0);
    }
   // printf("getMa1NotMarked\n");
    getMa1NotMarked(r, c);
   // printf("getMa2NotMarked r=%d c=%d\n", r, c);
    getMa2NotMarked(r, c);
  //  printf("tm2=%d\n", tm2);
  //  printf("getNotMarked\n");
    for(int i=0; i<LEN; i++)
    {
        tm[i]=tm1[i] | tm2[i];
   //     printf("tm[%d]=%d\n", i, tm[i]);
    }
  //  printf("step 114 \n");
    free(tm1);
    tm1=NULL;
    free(tm2);
    tm2=NULL;
  //  printf("getNotMarked finish\n");
    //return tm;
}
void setMa()
{
//    bool* tm=NULL;
    //计算出每个?处可以填的值有哪些
   // display2();
    for(int i=0; i<num; i++)
    {
        getNotMarked(arr[i].r, arr[i].c);
        for(int k=0; k<LEN; k++)
            ma[arr[i].r][arr[i].c][k]=tm[k];
        free(tm);
        tm=NULL;
    }
}
void init()
{
    memset(ma1, false, sizeof ma1);
    memset(ma2, false, sizeof ma2);
    memset(ma3, false, sizeof ma3);
    int i, j, sub;
    for(i=1; i<LEN; i++)
    {
        for(j=1; j<LEN; j++)
            if( s[i][j]!='?' )
            {
                sub=s[i][j]-'0';
                ma1[i][sub]=true;
                ma3[j][sub]=true;
                ma2[getMa2ProcessSub(i, j)][sub]=true;
            }
    }
  //  printf("setMa\n");
    setMa();
   // printf("setMa finish\n");
}
void DFS(int x)
{
    if( flag ) return;
    if( x>=num )
    {
        display();
        flag=true;
        return;
    }
    int i, j;
    i=arr[x].r;
    j=arr[x].c;
    for(int k=1; k<LEN; k++)
        if( ma[i][j][k]==false && flag==false )
        {
            s[i][j]=k+'0';
         //   printf("s[%d][%d]=%c\n",i, j, s[i][j]);
            init();
            //display2();
            //system("pause");
            x++;
            DFS(x);
            if( flag ) return;
            x--;
            s[i][j]='?';
            init();
        }
    return;
}
void myClear()
{
    if( tm ) free(tm);
    if( tm2 ) free(tm2);
    if( tm1 ) free(tm1);
}
int main()
{
    int i, j, k;
    black=false;
    while( scanf("%c", &s[1][1])!=EOF )
    {
        k=0;
        flag=false;
        for(i=1; i<LEN; i++)
        {
            if( i!=1 ) scanf("%c", &s[i][1]);
            if( s[i][1]=='?' ) arr[k].r=i, arr[k++].c=1;
            for(j=2; j<LEN; j++)
            {
                scanf(" %c", &s[i][j]);
                if( s[i][j]=='?' ) arr[k].r=i, arr[k++].c=j;
            }
            getchar();
        }
        num=k;
     //   display();
     //   printf("num=%d\n", num);
        init();
      //  display2();
        DFS(0);
        black=true;
        myClear();
        getchar();
    }
    return 0;
}

void display2()
{
    printf("ma1\n");
    for(int i=1; i<LEN; i++)
    {
        printf("%d", ma1[i][0]);
        for(int j=1; j<LEN; j++)
        {
            printf(" %d", ma1[i][j]);
        }
        printf("\n");
    }
    printf("\nma2\n");
    for(int i=1; i<LEN; i++)
    {
        printf("%d", ma2[i][0]);
        for(int j=1; j<LEN; j++)
        {
            printf(" %d", ma2[i][j]);
        }
        printf("\n");
    }
    printf("\nma3\n");
    for(int i=1; i<LEN; i++)
    {
        printf("%d", ma3[i][0]);
        for(int j=1; j<LEN; j++)
        {
            printf(" %d", ma3[i][j]);
        }
        printf("\n");
    }
    for(int i=0; i<num; i++)
    {
        printf("(%d,%d) ", arr[i].r, arr[i].c);
    }
    printf("\n");
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值