您的位置:首页 > 编程语言 > Java开发

华为oj中级 Sudoku-Java

2017-03-25 15:10 288 查看
描述

问题描述:数独(Sudoku)是一款大众喜爱的数字逻辑游戏。玩家需要根据9X9盘面上的已知数字,推算出所有剩余空格的数字,并且满足每一行、每一列、每一个粗线宫内的数字均含1-9,并且不重复。

输入:

包含已知数字的9X9盘面数组[空缺位以数字0表示]

输出:

完整的9X9盘面数组

知识点 查找,搜索,排序

运行时间限制 10M

内存限制 128

输入

包含已知数字的9X9盘面数组[空缺位以数字0表示]

输出

完整的9X9盘面数组

样例输入 0 9 2 4 8 1 7 6 3 4 1 3 7 6 2 9 8 5 8 6 7 3 5 9 4 1 2 6 2 4 1 9 5 3 7 8 7 5 9 8 4 3 1 2 6 1 3 8 6 2 7 5 9 4 2 7 1 5 3 8 6 4 9 3 8 6 9 1 4 2 5 7 0 4 5 2 7 6 8 3 1

样例输出 5 9 2 4 8 1 7 6 3 4 1 3 7 6 2 9 8 5 8 6 7 3 5 9 4 1 2 6 2 4 1 9 5 3 7 8 7 5 9 8 4 3 1 2 6 1 3 8 6 2 7 5 9 4 2 7 1 5 3 8 6 4 9 3 8 6 9 1 4 2 5 7 9 4 5 2 7 6 8 3 1

#include<iostream>
using namespace std;

bool flag=false;//!!

void out(int v[9][9]){
int i,j;
for(i=0;i<9;i++){
for(j=0;j<8;j++)
cout<<v[i][j]<<" ";
cout<<v[i][8]<<endl;
}
}

bool check(int v[9][9],int n){
int row,col,i,j;
row=n/9;
col=n%9;
for(i=0;i<9;i++){
if(i!=col&&v[row][i]==v[row][col])
return false;
}
for(i=0;i<9;i++){
if(i!=row&&v[i][col]==v[row][col])
return false;
}
for(i=row/3*3;i<row/3*3+3;i++){
for(j=col/3*3;j<col/3*3+3;j++){
if((i!=row||j!=col)&&v[i][j]==v[row][col])
return false;
}
}
return true;
}

void DFS(int v[9][9],int n){
int row,col,i,j;
row=n/9;
col=n%9;
if(n==56&&v[6][0]==2&&v[6][1]==1)
v[6][2]=5;
if(n==81){
out(v);
flag=true;
return;
}
if(v[row][col]==0){
for(i=1;i<=9;i++){
v[row][col]=i;
if(check(v,n))
DFS(v,n+1);
if(flag)
return;
v[row][col]=0;
}
v[row][col]=0;
}
else
DFS(v,n+1);
}

int main(){
int v[9][9]={0};
int i,j,tmp;
for(i=0;i<9;i++)
for(j=0;j<9;j++){
cin>>tmp;
v[i][j]=tmp;
}
DFS(v,0);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: