zoukankan      html  css  js  c++  java
  • 数独:dfs+剪枝+位运算+排除冗余+优化搜索顺序(未完)

    和蓝桥杯以前一个题一样,但是数据加强了,博主水平有限,没做出来,先在这里记录一下,这里正解,下面是博主的超时做法。最近准备考研,不能深入学习了。

    题目描述

    数独是一种传统益智游戏,你需要把一个9 × 9的数独补充完整,使得图中每行、每列、每个3 × 3的九宫格内数字1~9均恰好出现一次。

    请编写一个程序填写数独。

    输入格式
    输入包含多组测试用例。

    每个测试用例占一行,包含81个字符,代表数独的81个格内数据(顺序总体由上到下,同行由左到右)。

    每个字符都是一个数字(1-9)或一个”.”(表示尚未填充)。

    您可以假设输入中的每个谜题都只有一个解决方案。

    文件结尾处为包含单词“end”的单行,表示输入结束。

    输出格式
    每个测试用例,输出一行数据,代表填充完全后的数独。

    样例

    输入样例:
    .2738..1..1...6735.......293.5692.8...........6.1745.364.......9518...7..8..6534.
    ......52..8.4......3...9...5.1...6..2..7........3.....6...1..........7.4.......3.
    end
    输出样例:
    527389416819426735436751829375692184194538267268174593643217958951843672782965341
    416837529982465371735129468571298643293746185864351297647913852359682714128574936

    #include<iostream>
    #include<algorithm>
    #include<string>
    using namespace std;
    int m[10][10],kx[10][10],ky[10][10],kk[10][10];		//kx:行 ky:列 kk:方格
    int ans;
    
    
    void dfs(int x, int y) {
    	if (ans)return;
    	if (x == 9) {
    		ans = 1;
    		for (int i = 0; i < 9; i++) {
    			for (int j = 0; j < 9; j++)
    				cout << m[i][j];
    		}
    		cout << "
    ";
    	}
    	if (m[x][y] == 0) {
    		for (int i = 1; i < 10; i++) {
    			if (kx[x][i]==0&&ky[y][i]==0&& kk[3 * (x / 3) + (y / 3)][i]==0) {
    
    				kx[x][i] = 1;
    				ky[y][i] = 1;
    				kk[3 * (x/3) + (y/3)][i] = 1;
    				m[x][y] = i;
    				
    				if (y == 8)dfs(x + 1,0);
    				else dfs(x, y + 1);
    
    				kx[x][i] = 0;
    				ky[y][i] = 0;
    				kk[3 * (x / 3) + (y / 3)][i] = 0;
    				m[x][y] = 0;
    			}
    		}
    		return;
    	}
    	else {
    		if (y == 8)dfs(x + 1, 1);
    		else dfs(x, y + 1);
    	}
    }
    
    int main() {
    	ios::sync_with_stdio(0);
    	cin.tie(0),cout.tie(0);
    	string a;
    	while (cin >> a&&a[0] != 'e') {
    		memset(m, 0, sizeof(m));
    		memset(kx, 0, sizeof(kx));
    		memset(ky, 0, sizeof(ky));
    		memset(kk, 0, sizeof(kk));
    		ans = 0;
    		int len = a.size();
    		for (int i = 0; i < len; i++)
    		{
    			if (a[i] != '.') {
    				m[i / 9][i % 9] = a[i] - '0';		//终于把地图做好了。。
    				kx[i / 9][a[i] - '0'] = 1;
    				ky[i % 9][a[i] - '0'] = 1;
    				kk[3 * (i / 9 / 3) + (i % 9 / 3)][a[i] - '0'] = 1;		//初始化
    			}
    		}
    		dfs(0, 0);
    	}
    	return 0;
    }
    

      

     
  • 相关阅读:
    python线程详解
    Beego框架在模板中使用自定义函数
    golang打印英文格式时间日期
    如何让SQL语句不执行默认排序,而是按照in语句的顺序返回结果
    Git clone 报错 Unable to negotiate with xxx.xxx.xxx.xxx port 12345: no matching cipher found. Their offer: aes128-cbc,3des-cbc,blowfish-cbc
    Mysql去掉html标签函数
    Nodejs的npm安装模块时候报错:npm ERR! Error: CERT_UNTRUSTED的解决方法
    树莓派使用DHT11温湿度传感器
    ubuntu源列表(清华,阿里,官方,选一即可)
    将tgz文件解压到指定目录
  • 原文地址:https://www.cnblogs.com/52dxer/p/10458647.html
Copyright © 2011-2022 走看看