码迷,mamicode.com
首页 > 其他好文 > 详细

Summer Training #10 Div.2 E(暴力+回溯)

时间:2016-07-23 16:36:23      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:

题目链接

题意:给9乘9的数独矩阵,挖去其中5个元素,要求补全其余元素

所犯错误:1.题目中所给的数独矩阵本身可能就是错的(没认真看题,wa惨了)

       2.回溯时,遇到正确的答案就终止循环

技术分享
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
bool flag[3][11][11];
int n,a[11][11],b[7][5],k,ans[7],f;
bool valid(){
    for(int i=1;i<=9;i++)
    for(int j=1;j<=9;j++){
        for(int z=0;z<3;z++)
        if(flag[z][i][j]==true){return false;}
    }
    return true;
}
void found(int i){
    int j;
    if(i==6){if(valid())f=true;return;}
    for(j=1;(j<=9);j++){
            if((flag[0][b[i][0]][j])&&(flag[1][b[i][1]][j])&&(flag[2][b[i][2]][j])){
                flag[0][b[i][0]][j]=false;
                flag[1][b[i][1]][j]=false;
                flag[2][b[i][2]][j]=false;
                ans[i]=j;
                found(i+1);
                if(f)break;
                flag[0][b[i][0]][j]=true;
                flag[1][b[i][1]][j]=true;
                flag[2][b[i][2]][j]=true;
            }
            }
}
void init(){
    for(int i=1;i<=9;i++){
            for(int z=1;z<=9;z++){
                flag[0][i][a[i][z]]=false;
                flag[1][i][a[z][i]]=false;
                flag[2][i][a[(i-1)/3*3+1+(z-1)/3][(i-1)%3*3+1+(z-1)%3]]=false;

            }
    }
}
int main(){
    scanf("%d",&n);
    char c;
    while(n--){
        k=0;
        f=false;
        memset(flag,true,sizeof(flag));
        for(int i=1;i<=9;i++){
               getchar();
        for(int j=1;j<=9;j++){
            scanf("%c",&c);
            a[i][j]=int(c)-0;
            if(a[i][j]==0){
                k++;
                b[k][0]=i;
                b[k][1]=j;
                b[k][2]=((i-1)/3)*3+1+(j-1)/3;
            }
        }
        }
        init();
        found(1);
        if(f){
            for(int p=1;p<=5;p++)
            a[b[p][0]][b[p][1]]=ans[p];

            for(int i=1;i<=9;i++){
                for(int j=1;j<=9;j++){
                    printf("%d",a[i][j]);
                }
                printf("\n");
            }
        }
        else printf("Could not complete this grid.\n");
        printf("\n");
    }
    return 0;
}
View Code

 

Summer Training #10 Div.2 E(暴力+回溯)

标签:

原文地址:http://www.cnblogs.com/fuliujun/p/5698863.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!