回溯法解数独C++

数独游戏

数独游戏是由99共81个格子组成,其中整个网格分为33的大格子,大格子又分为3*3的小格子,给定一些格子中的数,往空白格子里面填数。规则是:只能填1-9这9个数字,而且每一行,每一列和每一大格子里一个数字只能出现一次。
输入格式:将81个字符按先下后上先左后右的顺序输为一行(未知的空白格子用‘ . ’表示),end表示结束的标志。
输出格式:每个输入数据输出为一行。

#include <bits/stdc++.h>
using namespace std;
string temp;
char maps[9][9];

bool judge(int count){    //判断这个数字能不能放进去
    int row=count/9;
    int col=count%9;
    //同一行不能有相同的
    for(int i=0;i<9;i++){
        if(maps[row][i]==maps[row][col] && i!=col){
            return false;
        }
    }
    //同一列不能有相同的
    for(int i=0;i<9;i++){
        if(maps[i][col]==maps[row][col]&& i!=row){
            return false;
        }
    }
    //同一个3*3小方块里不能有相同的
    int x=row/3*3;
    int y=col/3*3;      //找到所在小方块左上角的位置

    for(int i=x;i<x+3;i++){
        for(int j=y;j<y+3;j++){
            if(maps[i][j]==maps[row][col]&&i!=row&&j!=col){
                return false;
            }
        }
    }

}

void retrace(int count){
    if(count==81){
        for(int i=0;i<9;i++){
            for(int j=0;j<9;j++){
                cout<<maps[i][j];
            }
        }
        cout<<endl;
        return;
    }
    int row=count/9;
    int col=count%9; 
    if(maps[row][col]=='.'){
        for(int i=0;i<9;i++){
            maps[row][col]=(char)('1'+i);
            if(judge(count)){
                retrace(count+1); //扫描下一个小方格
            }
        }
        maps[row][col]='.';   //回溯
    }
    else
    {
        retrace(count+1);
    }
    

}
int main() 
{
    while(cin>>temp,temp!="end"){
        int q=0;
        for(int i=0;i<9;i++){
            for(int j=0;j<9;j++){
                maps[i][j]=temp[q++];
            }
        }
    retrace(0);

    }
    
    system("pause");
    return 0;
} 

感觉这种方法太过暴力,递归层数太多,而且无优化,遇到特殊的数据可能回超时,如果读者有好的算法或者优化方法,希望在评论区指出,互相学习,共同进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值