首页 > 其他 > 详细

20200201新的一个月继续写搜索 POJ - 2676 Sudoku

时间:2020-02-01 13:28:14      阅读:79      评论:0      收藏:0      [点我收藏+]

这两天的总结都是第二天发布的害 娱乐时间总是不会想起干正事的

决定从这一篇起加上题目标题(好像什么水题都能拿得出手一样>>>>>>>>>直达??还没捣鼓出来

 

===================================分割线===================================

POJ - 2676

#include <iostream>
#include <cstring>
#include <queue>
#include <math.h>
#include <map>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[10][10];
int line[10][10],row[10][10],block[10][10];
int n,m,flag;
struct point{int l,x,y;};
typedef pair<point,int>p;
int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};
point now,newo,ende;
queue<p> qu;
inline int read(){
    int x=0,f=1;char c=getchar();
    while(c<‘0‘||c>‘9‘){if(c==‘-‘)f=-1;c=getchar();}
    while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘;c=getchar();}
    return x*f;
}

inline void clean(){
    memset(a,0,sizeof(a));
    memset(line,0,sizeof(line));
    memset(row,0,sizeof(row));
    memset(block,0,sizeof(block));
    flag=0;
}

int go(int i,int j){
    if(i>0 && i<4 && j>0 && j<4)return 1;
    if(i>3 && i<7 && j>0 && j<4)return 2;
    if(i>6 && i<10 && j>0 && j<4)return 3;
    if(i>0 && i<4 && j>3 && j<7)return 4;
    if(i>3 && i<7 && j>3 && j<7)return 5;
    if(i>6 && i<10 && j>3 && j<7)return 6;
    if(i>0 && i<4 && j>6 && j<10)return 7;
    if(i>3 && i<7 && j>6 && j<10)return 8;
    return 9;
}

void print(){
    for(int i=1;i<=9;i++){
        for(int j=1;j<=9;j++)
            cout<<a[i][j];
        cout<<endl;
    }
}

void dfs(int i,int j){
    if(!flag){
        if(i==9){
            if(j==9 && a[i][j])
                j++;
            if(j==10)
                {print();flag=1;}
        }
        if(j>9){i++,j=1;}
        if(!a[i][j]){
            for(int p=1;p<=9;p++){
                if(!row[i][p] && !line[j][p] && !block[go(i,j)][p]){
                    a[i][j]=p,line[j][p]=1,row[i][p]=1,block[go(i,j)][p]=1;
                    dfs(i,j+1);
                    a[i][j]=0,row[i][p]=0,line[j][p]=0,block[go(i,j)][p]=0;
                }
            }
            return;
        }
        dfs(i,j+1);
    }
}

int main()
{
	n=read();
	char ll;
	int temp;
	while(n--){
        clean();
        for(int j=1;j<=9;j++){
            for(int i=1;i<=9;i++){
                ll=getchar();
                temp=ll-‘0‘;
                a[j][i]=temp;line[i][temp]=1;row[j][temp]=1;block[go(j,i)][temp]=1;
            }
            ll=getchar();
        }
        dfs(1,1);
	}
	return 0;
}

 

 

20200201新的一个月继续写搜索 POJ - 2676 Sudoku

原文:https://www.cnblogs.com/tabshh/p/12247538.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!