saber_jk的博客

一个学生的学习记录

【oj】靶形数独

#include<stdio.h>
#include<math.h>
#include<memory.h>
int sudoku[10][10],piece[30][10],line[10][10],row[10][10],result=-1;


int max(int a,int b){
    if(a>b)return a;
    else
        return b;
}


void dfs(){
    int i,j,count=10,marki,markj;
    int k;
    for(i=1;i<10;i++){
        for(j=1;j<10;j++){
            if(!sudoku[i][j]){
                int tempcount=0;
                for(k=1;k<10;k++){
                    if(!piece[(i-1)/3*3+(j-1)/3+1][k] && !row[i][k] &&!line[j][k])tempcount++;
                }
                if(tempcount<count){
                    count=tempcount;
                    marki=i;
                    markj=j;
                }
            }
        }
    }
    if(count==10){
        int tempresult=0;
        for(i=1;i<10;i++){
            for(j=1;j<10;j++){
                tempresult+=sudoku[i][j]*(10-max(abs(i-5),abs(j-5)));
            }
        }
        result=max(tempresult,result);
        return;
    }
    for(k=1;k<10;k++){
            if(!piece[(marki-1)/3*3+(markj-1)/3+1][k]&&!row[marki][k]&&!line[markj][k]){
                piece[(marki-1)/3*3+(markj-1)/3+1][k]=1;
                row[marki][k]=1;
                line[markj][k]=1;
                sudoku[marki][markj]=k;
                dfs();
                piece[(marki-1)/3*3+(markj-1)/3+1][k]=0;
                row[marki][k]=0;
                line[markj][k]=0;
                sudoku[marki][markj]=0;
            }
    }
}

int main(){
    int i,j;
    memset(piece,0,sizeof(piece));
    memset(line,0,sizeof(line));
    memset(row,0,sizeof(row));
    for(i=1;i<10;i++){
        for(j=1;j<10;j++){
            scanf("%d",&sudoku[i][j]);
            piece[(i-1)/3*3+(j-1)/3+1][sudoku[i][j]]=1;
            row[i][sudoku[i][j]]=1;
            line[j][sudoku[i][j]]=1;
        }
    }
        dfs();
        printf("%d",result);
        return 0;
}

阅读更多
个人分类: 代码
上一篇【nexys3】【verilog】小设计——拆弹游戏
下一篇【百炼oj】4033:铺地毯
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭