zoukankan      html  css  js  c++  java
  • acwing 166数独

    acwing 166数独

    问题

    传送门

    代码

    #include <iostream>
    #include <cstdio>
    #include <queue>
    #include <cstring>
    using namespace std;
    const int N = 9;
    int ones[1<<N],map[1<<N];
    int row[N],col[N],cell[N/3][N/3];
    char str[100];
    int lowbit(int x)
    {
        return x&(-x);
    }
    void init()
    {
        for(int i=0;i<N;i++)
        {
            row[i] = col[i] = (1<<N)-1;
        }
        for(int i=0;i<3;i++)
        {
            for(int j=0;j<3;j++)
            {
                cell[i][j] = (1<<N)-1;
            }
        }
    }
    int get(int x,int y)
    {
        return row[x] & col[y] & cell[x/3][y/3];
    }
    bool dfs(int cnt)
    {
        if(!cnt)
            return true;
        int minn = 10,x,y;
        for(int i=0;i<N;i++)
        {
            for(int j=0;j<N;j++)
            {
                if(str[i*9+j]=='.')
                {
                    int cnt = ones[get(i,j)];
                    if(minn>cnt)
                    {
                        minn = cnt;
                        x = i;
                        y = j;
                    }
                }
            }
        }
        for(int i=get(x,y);i;i-=lowbit(i))
        {
            int t = map[lowbit(i)];
            row[x] -= (1<<t);
            col[y] -= (1<<t);
            cell[x/3][y/3] -= (1<<t);
            str[x*9+y] = t+'1';
            if(dfs(cnt-1))
                return true;
            row[x] += (1<<t);
            col[y] += (1<<t);
            cell[x/3][y/3] += (1<<t);
            str[x*9+y] = '.';
        }
        return false;
    }
    int main() {
        for(int i=0;i<N;i++)
        {
            map[1<<i] = i;
        }
        for(int i=0;i<(1<<N);i++)
        {
            int sum = 0;
            for(int j=i;j;j-=lowbit(j))
            {
                sum++;
            }
            ones[i] = sum;
        }
        while(cin >> str,str[0]!='e')
        {
            init();
            int cnt=0;
            for(int i=0;i<N;i++)
            {
                for(int j=0;j<N;j++)
                {
                    if(str[j+i*9]!='.')
                    {
                        int cnt = str[j+i*9] - '1';
                        row[i] -= (1 << cnt);
                        col[j] -= (1 << cnt);
                        cell[i/3][j/3] -= (1<<cnt);
                    }
                    else
                    {
                        cnt++;
                    }
                }
            }
            dfs(cnt);
            cout << str << "
    ";
        }
        return 0;
    }
    
  • 相关阅读:
    C++进程通信之命名管道
    从Win32过渡到MFC工程
    Windows常用消息处理与自定义消息
    Windows窗口开发原理(窗口的创建&消息机制)
    _T、_TEXT、TEXT、L的使用记录
    几种多线程同步方式总结
    异步编程之async&await
    rpc理解
    docker 基础namespace cgroup overlayfs network
    python编程书籍资料整理大全
  • 原文地址:https://www.cnblogs.com/hh13579/p/12398154.html
Copyright © 2011-2022 走看看