#include<bits/stdc++.h>
using namespace std;
#define infile "infile.in"
#define outfile "outfile.out"
#ifdef cin_cout_f
#define cin _____in_____
#define cout _____out_____
ifstream _____in_____(infile);
ofstream _____out_____(outfile);
#else
#ifdef speedup
void spup(){
ios::sync_with_stdio(false);
cin.tie(0);
}
#endif
#endif
#define try_times 81
struct node{
int x,y;
};
int cnt = 81;
unsigned long long ans_counter;
vector<node>nums;
vector<vector<int>>img,ans;
vector<vector<bool>>rest,flag;
vector<vector<vector<int>>>cases;
set<int>lines[15],rows[15],cities[15];
bool cmp(node x,node y){
return cases[x.x][x.y].size()<cases[y.x][y.y].size();
}
int city(int i,int j){
return ((i-1)/3)*3+((j-1)/3)+1;
}
void find_cases(){
for(int i = 1;i <= 9;i++){
for(int j = 1;j <= 9;j++){
if(!flag[i][j]){
cases[i][j].clear();
for(int k = 1;k <= 9;k++){
if((!lines[i].count(k))&&(!rows[j].count(k))&&(!cities[city(i,j)].count(k))){
cases[i][j].push_back(k);
}
}
}
}
}
}
void solve(){
for(int i = 1;i <= 9;i++){
for(int j = 1;j <= 9;j++){
if(!flag[i][j]&&cases[i][j].size() == 1){
ans[i][j] = cases[i][j][0];
lines[i].insert(cases[i][j][0]);
rows[j].insert(cases[i][j][0]);
cities[city(i,j)].insert(cases[i][j][0]);
flag[i][j] = 1;
cnt--;
}
}
}
}
bool check(int x,int y,int num){
return (lines[x].count(num) == 0)&&(rows[y].count(num) == 0)&&(cities[city(x,y)].count(num) == 0);
}
void print(){
ans_counter++;
for(int i = 1;i <= 9;i++){
for(int j = 1;j <= 9;j++){
if(!rest[i][j]){
if(ans[i][j]){
printf("\033[38;2;%d;%d;%dm%d \033[0m",0,150,150,ans[i][j]);
}else{
printf("\033[38;2;%d;%d;%dm%d \033[0m",255,0,0,ans[i][j]);
}
}else{
cout<<ans[i][j]<<' ';
}
if(j%3 == 0){
cout<<' ';
}
}
cout<<'\n';
if(i%3 == 0){
cout<<'\n';
}
}
cout<<"-------------------\n";
}
void dfs(int deep){
if(deep >= nums.size()){
print();
return;
}
int x = nums[deep].x,y = nums[deep].y;
for(int i = 0;i < cases[x][y].size();i++){
int t = cases[x][y][i];
if(check(x,y,t)){
ans[x][y] = t;
lines[x].insert(t);
rows[y].insert(t);
cities[city(x,y)].insert(t);
cnt--;
flag[x][y] = 1;
dfs(deep+1);
ans[x][y] = 0;
lines[x].erase(t);
rows[y].erase(t);
cities[city(x,y)].erase(t);
cnt++;
flag[x][y] = 0;
}
}
}
void algo(){
cout<<'\n';
for(int i = 0;i < try_times;i++){
find_cases();
solve();
}
if(cnt <= 0){
print();
}else{
for(int i = 1;i <= 9;i++){
for(int j = 1;j <= 9;j++){
if(!flag[i][j]){
nums.push_back((node){i,j});
}
}
}
sort(nums.begin(),nums.end(),cmp);
dfs(0);
}
if(ans_counter == 0){
printf("\033[38;2;%d;%d;%dm%s \033[0m",255,0,0,"No solution!");
}else{
if(ans_counter == 1){
printf("There is \033[38;2;%d;%d;%dm1\033[0m solution!",0,150,150);
}else{
printf("There are \033[38;2;%d;%d;%dm%lld\033[0m solutions!",0,150,150,ans_counter);
}
}
}
int main(){
img.resize(15,vector<int>(15));
ans.resize(15,vector<int>(15));
flag.resize(15,vector<bool>(15));
rest.resize(15,vector<bool>(15));
cases.resize(15,vector<vector<int>>(15));
for(int i = 1;i <= 9;i++){
for(int j = 1;j <= 9;j++){
int num;
cin>>num;
img[i][j] = ans[i][j] = num;
if(num){
cnt--;
lines[i].insert(num);
rows[j].insert(num);
cities[city(i,j)].insert(num);
rest[i][j] = flag[i][j] = 1;
}
}
}
algo();
system("pause");
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析