5 条题解

  • 3
    @ 2023-7-17 11:17:46
    #include <bits/stdc++.h>
    #define LL long long
    using namespace std;
    const int N = 1e6 + 10;
    const int INF = 0x3f3f3f3f;
    int a[15][15];
    int c[12],r[12],g[12];
    int st[511];
    string s;
    void init() 
    {
    	memset(a,0,sizeof(a));
    	for (int i=0;i<=9;i++) c[i] = r[i] = g[i] = 511;
    }
    int find(int x,int y) 
    {
    	return r[x] & c[y] & g[ x/3*3 + y/3];
    }
    bool dfs() 
    {
    	int ans = 10;
    	int x,y;
    	for (int i=0;i<9;i++) 
    	{
    		for (int j=0;j<9;j++) 
    		{
    			if(a[i][j] == 0) 
    			{
    				int num = st[find(i,j)];
    				if(num < ans) ans = num, x = i,y = j;
    			}
    		}
    	}
    	if(ans == 10) return true;
    	int p = find(x,y);
    	for (int i=0;i<9;i++) 
    	{
    		int num = 1 << i;
    		if(num & p) 
    		{
    			r[x] -= num;
    			c[y] -= num;
    			g[ x/3*3 + y/3] -= num;
    			a[x][y] = i + 1;
    			if(dfs()) return true;
    			r[x] += num;
    			c[y] += num;
    			g[ x/3*3 + y/3] += num;
    			a[x][y] = 0;
    		}
    	}
    	return false;
    }
    int main() 
    {
    	for (int i=0;i<512;i++) 
    	{
    		int f = i;
    		while(f) 
    		{
    			st[i] ++;
    			f -= (f&-f);
    		}
    	}
    	while(cin >> s && s != "end") 
    	{
    		init();
    		for (int i=0;i<81;i++) 
    		{
    			a[i/9][i%9] = (s[i] == '.' ? 0 : s[i] - 48);
    		}
    		for (int i=0;i<9;i++) 
    		{
    			for (int j=0;j<9;j++) 
    			{
    				if(a[i][j] != 0) 
    				{
    					int num = 1 << (a[i][j] - 1);
    					r[i] -= num;
    					c[j] -= num;
    					g[i/3*3 + j/3] -= num;
    				}
    			}
    		}
    		dfs();
    		for (int i=0;i<9;i++) 
    		{
    			for (int j=0;j<9;j++) 
    			{
    				cout << a[i][j];
    			}
    		}
    		cout << endl;
    	}
    	return 0;
    }
    
    ```‸

    信息

    ID
    77
    时间
    1000ms
    内存
    128MiB
    难度
    5
    标签
    递交数
    272
    已通过
    101
    上传者