• 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 1703 [Find them, Catch them 帮派之争]
    《Python 第五章》条件,循环和其他语句
    《Python 第一章》基础知识
    heapSort 堆排序 / 二叉堆
    并查集 hdu 1856 示例
    KMP / hdu 1711 [找到匹配的位置并返回]
    《Python 第四章》字典
    EnumChildWindows的使用
    C#查找指定窗口的子窗口的句柄
    C#里字符串取左边N个字符,右边N个字符,从中间取N个字符的函数
  • 原文地址:https://www.cnblogs.com/cj695/p/2644745.html
Copyright © 2020-2023  润新知