警告: qdu14级信安同学请不要复制此代码,要不然会被查重……
首先此题应该用 搜索 来做。
扫描二维码关注公众号,回复:
11471561 查看本文章
初步构想,通过划分的9个小方格,将每个小方格内带?的地方的可能值列出来,存在vector里,这样搜索的时候只需判断行或者列是否满足规则就可。
然后我就开始搜点了,一个一个搜,结果没做出来……(好笨……)
然后百度了一波大神的,发现他们都是直接搜带?的点,恍然大悟。于是修改代码,加了结构体。
历尽千辛万苦,终于做出答案来了,赶紧提交,超时了……
看到大神写的注意事项,原来用while(1) 会超时,于是改成while(~scanf) ,瞥了一眼大神的就自己改,发现输入直接不对,当时用的str[10] ,和 %s 直接挂了,才看见输入中间有空格,只好仔细研究大神的输入,发现用的str[2],在str[0]取数,空格存在str[1]里 ,极妙的做法,活到老,学到老。
改过来提交,还是超时……好气呀!!!!!
找不出猫饼了……只有用vector存的值,和AC代码不同(直接枚举1到9),没办法,我也改成直接枚举1到9,然后过了。不过还是想不通为什么用vector存可能值会超时……
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <list>
#include <cstring>
#include <string>
#include <queue>
#include <vector>
using namespace std;
typedef struct WH{ ///用结构体存储 ? 的坐标
int x;
int y;
}wh;
int a[15][15]; ///数独面板
int f[15];
int tm = 1; ///带?的个数+1
vector<int> v[15];
int flag = 0; ///结束标志
wh q[100]; /// '?' 节点存储
int getfg(int x,int y){ ///获取坐标所在的3X3方格位置
return ((x-1)/3)*3+((y-1)/3+1);
}
int getzb(int t){
int xx=(t)/3*3+1;
int yy=(t+1)%3-1;
printf("%d %d\n",xx,yy);
return 0;
}
bool isok9(int x,int y,int ans){ ///3X3小方格或行或列符合规则吗
for(int i = 1; i <= 9; ++i)
if(a[i][y] == ans)
return false;
for(int i = 1; i <= 9; ++i)
if(a[x][i] == ans)
return false;
//int tmp = getfg(x,y);
int xx=(x-1)/3*3+1;
int yy=(y-1)/3*3+1;
for(int i = xx; i < xx+3; ++i){
for(int j = yy; j < yy+3; ++j){
if(a[i][j] == ans) return false;
}
}
return true;
}
void print(){ ///打印结果
for(int i = 1; i <= 9; ++i){
printf("%d",a[i][1]);
for(int j = 2; j <= 9; ++j){
printf(" %d",a[i][j]);
}
printf("\n");
}
//printf("\n");
}
void printv(){
for(int i = 1; i <= 9; ++i){
printf("%d: ",i);
for(int j = 0; j < (int)v[i].size(); ++j){
printf("%d ",v[i].at(j));
}
printf("\n");
}
}
void printwh(){
for(int i = 1; i < tm; ++i){
printf("%d %d : %d\n",q[i].x,q[i].y,getfg(q[i].x,q[i].y));
}
}
void dfs(int t){
if(t == tm){ ///搜到最后一个点结束
flag = 1;
return;
}
int x = q[t].x;
int y = q[t].y;
//for(int i = 0; i < (int)v[tmp].size(); ++i){
for(int i = 1; i <= 9; ++i){
if(isok9(x,y,i)){
a[x][y] = i;
dfs(t+1);
if(flag) return;
a[x][y] = 0;
}
}
}
int main(int argc, char *argv[]) {
int k = 1;
char str[2];
while(~scanf("%s",str)){
getchar();
tm = 1;
flag = 0;
//memset(book,0,sizeof(book));
memset(f,0,sizeof(f));
for(int i = 1; i <= 9; ++i) v[i].clear();
if(str[0] != '?') a[1][1] = str[0] - '0';
else{
q[tm].x = 1;
q[tm++].y = 1;
a[1][1] = 0;
}
for(int i = 1; i <= 9; ++i){
for(int j = 1; j <= 9; ++j){
if(i == 1 && j == 1) continue;
scanf("%s",str);
if(str[0] != '?') a[i][j] = (str[0]-'0');
else{
q[tm].x = i;
q[tm++].y = j;
a[i][j] = 0;
}
}
}
for(int i = 1; i <= 9; i += 3){
for(int j = 1; j <= 9; j += 3){
memset(f,0,sizeof(f));
for(int k = i; k < i+3; ++k){
for(int l = j; l < j+3; ++l){
f[a[k][l]] = 1;
}
}
int t = getfg(i,j);
for(int k1 = 1; k1 <= 9; ++k1)
if(f[k1] == 0) v[t].push_back(k1);
}
}
dfs(1);
if(k == 1){
print();
k++;
}
else{
printf("\n");
print();
}
}
return 0;
}