BZOJ3109: [cqoi2013]新数独(暴力dfs)

题意:传送门

题解:用h[i][j]记录第i行j是否出现,用l[i][j]记录第i列j是否出现,用g[i][j]记录第i个子宫格j是否出现,用f[i][j][k]记录第i个子宫格第j个数和第k个数的关系,然后进行暴搜即可。

附上代码:

#include<bits/stdc++.h>
using namespace std;
int a[10][10],h[10][10],l[10][10],g[10][10],f[10][10][10];
void dfs(int x,int y)
{
    if(x==9&&y==10){
        for(int i=1;i<=9;i++){
            for(int j=1;j<=9;j++){
                printf("%d ",a[i][j]);
            }
            printf("\n");
        }
        exit(0);
    }
    if(y==10){
        x=x+1;y=1;
    }
    for(int i=1;i<=9;i++){
        bool bl=0;
        int g1=((x-1)/3)*3,g2=(y-1)/3,g3=g1+g2;
        if(g[g3][i]==1||h[x][i]==1||l[y][i]==1)continue;
        for(int j=1;j<=9;j++){
            int ii=(x-1)%3*3+(y-1)%3+1;
            if(f[g3][ii][j]==1){
                int xj=g3/3*3+(j-1)/3+1,yj=g3%3*3+(j-1)%3+1;
                if(a[xj][yj]!=0){
                    if(i<a[xj][yj]){
                        bl=1; break;
                    }
                }
            }
            if(f[g3][ii][j]==2){
                int xj=g3/3*3+(j-1)/3+1,yj=g3%3*3+(j-1)%3+1;
                if(a[xj][yj]!=0)
                  if(i>a[xj][yj]){
                    bl=1; break;
                }
            }
        }
        if(bl==1) continue;
        g[g3][i]=1;h[x][i]=1;l[y][i]=1;
        a[x][y]=i;
        dfs(x,y+1);
        a[x][y]=0;
        g[g3][i]=0;h[x][i]=0;l[y][i]=0;
    }
}
int main()
{
    char s;
    for(int i=1;i<=3;i++){
        for(int k=1;k<=5;k++){
            if(k%2==1){
                for(int j=1;j<=6;j++){
                    int q1=(i-1)*3,q2=(j-1)/2,q3=q1+q2;
                    cin>>s;
                    if(s=='>'){
                        int qq=(k-1)/2*3+(j-1)%2+1;
                        f[q3][qq][qq+1]=1;
                        f[q3][qq+1][qq]=2;
                    }else{
                        int qq=(k-1)/2*3+(j-1)%2+1;
                        f[q3][qq][qq+1]=2;
                        f[q3][qq+1][qq]=1;
                    }
                }
            }else{
                for(int j=1;j<=9;j++){
                    int q1=(i-1)*3,q2=(j-1)/3,q3=q1+q2;
                    cin>>s;
                    if(s=='v'){
                        int qq=(k-1)/2*3+(j-1)%3+1;
                        f[q3][qq][qq+3]=1;
                        f[q3][qq+3][qq]=2;
                    }else{
                        int qq=(k-1)/2*3+(j-1)%3+1;
                        f[q3][qq][qq+3]=2;
                        f[q3][qq+3][qq]=1;
                    }
                }
            }
        }
    }
    dfs(1,1);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhouzi2018/article/details/87900197