zoukankan      html  css  js  c++  java
  • hdu3111解数独。简单深搜不带剪枝

    10天没写代码了啊。,一个这样的搜索写了两小时。。我擦。。

    搜索部分没什么好说的。。主要就是visited标记位。。申明类型为int。以后每次visited就+1,回溯就-1。。这样就可以避免交叉的问题出现(感谢春哥的方法。)

    #include<iostream>
    using namespace std;
    
    int map[10][10];
    int visited[10][10][10];
    void init()
    {
        memset(visited,0,sizeof(visited));
    }
    bool dfs(int num)
    {
        int i,j;
        int k;
        i=num/9;
        j=num%9;
        while(num<=80&&map[i][j]!=-1)
        {
            num++;
            i=num/9;
            j=num%9;
        }
        i=num/9;
        j=num%9;
        if(num>=81)
        {
            return 1;
        }
        for(k=1;k<=9;k++)
        {
            if(!visited[i][j][k])
            {
                visited[i][j][k]=1;
                map[i][j]=k;
                int l;
                for(l=0;l<=8;l++)
                {
                    visited[i][l][map[i][j]]++;
                    visited[l][j][map[i][j]]++;
                    visited[(i/3)*3+l/3][(j/3)*3+l%3][map[i][j]]++;
                    //cout<<(i/3)*3+l/3<<"|"<<(j/3)*3+l%3<<endl;
                }
                if((dfs(num+1)))
                {
                    return 1;
                }else
                {
                    int l;
                    for(l=0;l<=8;l++)
                    {
                        visited[i][l][map[i][j]]--;
                        visited[l][j][map[i][j]]--;
                        visited[(i/3)*3+l/3][(j/3)*3+l%3][map[i][j]]--;
                    }
                    visited[i][j][k]=0;
                    map[i][j]=-1;
                }
            }
        }
        return 0;
    }
    int main()
    {
        int t;
        cin>>t;
        bool tag=0;
        bool tag2=0;
        while(t--)
        {
            if(tag2)
            {
                char fuck[44];
                cin>>fuck;
            }
            tag2=1;
            int i,j;
            int done=0;
            init();
            for(i=0;i<=8;i++)
            {
                for(j=0;j<=8;j++)
                {
                    char c;
                    cin>>c;
                    if(c=='?')
                    {
                        map[i][j]=-1;
                    }else
                    {
                        map[i][j]=c-'0';
                        done++;
                        int k;
                        for(k=0;k<=8;k++)
                        {
                            visited[i][k][map[i][j]]++;
                            visited[k][j][map[i][j]]++;
                            visited[(i/3)*3+k/3][(j/3)*3+k%3][map[i][j]]++;
                            //cout<<(i/3)*3+k/3<<"|"<<(j/3)*3+k%3<<endl;
                        }
                    }
                }
            }
            if(dfs(0))
            {
                if(tag)
                {
                    cout<<"---"<<endl;
                }
                for(i=0;i<=8;i++)
                {
                    for(j=0;j<=8;j++)
                    {
                        cout<<map[i][j];
                    }
                    cout<<endl;
                }  
                tag=1;
                
            }else
            {
                if(tag)
                {
                    cout<<"---"<<endl;
                }
                cout<<"impossible"<<endl;
                tag=1;
            }
        }
        return 0;
    }
    

      

  • 相关阅读:
    poj 3243 Clever Y(BabyStep GiantStep)
    poj 2417 Discrete Logging
    poj 3481 Double Queue
    hdu 4046 Panda
    hdu 2896 病毒侵袭
    poj 1442 Black Box
    hdu 2815 Mod Tree
    hdu 3065 病毒侵袭持续中
    hdu 1576 A/B
    所有控件
  • 原文地址:https://www.cnblogs.com/cj695/p/2644745.html
Copyright © 2011-2022 走看看