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;
    }
    

      

  • 相关阅读:
    UML常识
    我的一些冒出来的想法
    那些我接触过的软件
    对PL/SQL的认识
    JavaScrip笔记
    万丈高楼平地起
    HTML DOM和JavaScrip的关系
    拾起荒废的英语
    Tomcat文件映射路径
    Access-Control-Allow-Origin
  • 原文地址:https://www.cnblogs.com/cj695/p/2644745.html
Copyright © 2011-2022 走看看