部分代码,dfs还没写
#include <bits/stdc++.h>
using namespace std;
int n[20][20],v[20];
int x[]={1,2,3,4,5,6,7,8,9};
int judge(){//判断用了多少个相同数字
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++)
for(int k=1;j<=9;k++){
if(n[j][k]==i)v[i]++;
}
}
void dfs(int a,int b){
//行列,相邻上下左右斜对角都不能重复,还没想好怎么写
}
int main(){
vector<int>z;
int w;
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++){
if(cin>>w)//正常取值
n[i][j]=w;
else{
cin.clear();//清除错误标记,将为?的记为0
cin.get();
}
}
judge();
for(int i=1;i<=9;i++){
if(v[i]>=9)v[i]=0;//用完了
else if(v[i]<9)v[i]=9-v[i];//剩余可用
}
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++)
if(n[i][j]==0)
dfs(i,j);
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++){
if(j==9)
printf("%d\n",n[i][j]);
else
printf("%d ",n[i][j]);
}
return 0;
}
这样运行,输入的“?”输出为0。
#include <bits/stdc++.h>
using namespace std;
int n[20][20],v[20];
int x[]={1,2,3,4,5,6,7,8,9};
int judge(){//判断用了多少个相同数字
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++)
for(int k=1;j<=9;k++){
if(n[j][k]==i)v[i]++;
}
}
void dfs(int a,int b){
//行列,相邻上下左右斜对角都不能重复,还是不会写
}
int main(){
vector<int>z;
int w;
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++){
if(cin>>w)//正常取值
n[i][j]=w;
else{
cin.clear();//清除错误标记,将为?的记为0
cin.get();
}
}
/*judge();
for(int i=1;i<=9;i++){
if(v[i]>=9)v[i]=0;//用完了
else if(v[i]<9)v[i]=9-v[i];//剩余可用
}*/
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++)
if(n[i][j]==0)
dfs(i,j);
for(int i=1;i<=9;i++)
for(int j=1;j<=9;j++){
if(j==9)
printf("%d\n",n[i][j]);
else
printf("%d ",n[i][j]);
}
return 0;
}
通过代码:
#include<bits/stdc++.h>
using namespace std;
int m[10][10];
int num;
struct zuobiao{
int x,y;
} a[100];
int judge(int k,int step){
int x,y;
for(int i=0; i<9; i++)
if(m[a[step].x][i]==k||m[i][a[step].y]==k)//判断这个数所处的行和列有没有出现重复的数
return 0;
x=(a[step].x/3)*3;
y=(a[step].y/3)*3;
for(int i=x; i<x+3; i++)//判断小九宫格里面有没有重复的数
for(int j=y; j<y+3; j++)
if(m[i][j]==k)
return 0;
return 1;
}
void dfs(int step){
if(step==num){
for(int i=0; i<9; i++){
for(int j=0; j<8; j++)
cout<<m[i][j]<<" ";
cout<<m[i][8]<<endl;
}
return;
}
for(int i=1; i<=9; i++){
if(judge(i,step)){
m[a[step].x][a[step].y]=i;
dfs(step+1);//搜索下一个数的填法
m[a[step].x][a[step].y]=0;
}
}
return;
}
int main(){
int q=0;
char s;
while(cin>>s){
num=0;
if(s=='?'){
a[num].x=0;
a[num].y=0;
num++;
m[0][0]=0;
}
else
m[0][0]=s-'0';
for(int i=0; i<9; i++){//后面的数,?用0代替
for(int j=0; j<9; j++){
if(i==0&&j==0)continue;
cin>>s;
if(s=='?'){
a[num].x=i;
a[num].y=j;
num++;
m[i][j]=0;
}
else
m[i][j]=s-'0';
}
}
if(q++)//换行
cout<<endl;
dfs(0);
}
return 0;
}