用舞蹈鏈實現數獨2

2021-06-28 21:39:56 字數 3559 閱讀 3759

輸入12 12 12顯示答案,如果沒有顯示就是沒有結果

輸入13 13 13更換數獨開局

輸入0-8 0-8 0-9在指定位置放值

輸入11 11 11檢驗數獨是否正確

#include#include#include//rand函式

#include//srand函式

#include"consolecolor.h"

#includeusing namespace std;

#define rr 729 //81*9 建立出9個舞蹈鏈,分別代表填入的數字?

#define cc 324 //81*4 約束條件?

#define inf 1000000000

class node;

class dealwithsudoku//dealwithsudoku

void initial()

void setch(int a[9])//for

}//for

ch[81]='\0';

builddl();

}//setch

void builddl()//for

//建立行

for(i=-1;++idown=&row[i];

row[i].down->up=&row[i];

}//for

int r,c,val,tr,tc;

for(i=-1;++iright=row[i].right;

row[i].right->left=row[i].left;

} solve(1);

}//builddl

void link(int r,int c)

void remove(int c)

}} void resume(int c)

} col[c].left->right=&col[c];

col[c].right->left=&col[c];

} void solve(int k)

scnt++;

return;

} node *t,*tt;

int min=inf,tc;

for(t=head.right;t!=&head;t=t->right)

} //移除這一列

remove(tc);

for(t=col[tc].down;t!=&col[tc];t=t->down)

t->left->right=t->right;

solve(k+1);

if(scnt>=2)return;

t->right->left=t;

for(tt=t->left;tt!=t;tt=tt->left)

t->right->left=t->left;

} resume(tc);

return;

} int* returnresult()

else return null;

}};class range

void assign(int is,int ie,int js,int je)

bool i_check(int i)

bool j_check(int j)

bool check(int i,int j)

};/*

class node

locked=false;

} bool onlyone()

if(sum==1)return true;

return false;

} int result()

} }void setfalse(int i)

};*/

dealwithsudoku dws;

class sudoku

} return -1;

} bool area_check(int is,int ie,int js,int je)//if

}//for

}//for

for(i=-1;++i'9')//if

}//for

}//for

for(i=-1;++i<81;)

a[i/9][i%9]=(int)(c[i]-'0');

}//for

} bool all_check()//if

}//for

for(i=-1;++i<9;)

}for(temp=j;++temp<9;)

}}//for

}//for

return true;

} bool row_check(int r)

}} return true;

} bool col_check(int c)

}} return true;

} sudoku()//for

}//for

int sum=rand()%40,temp;

for(;sum--!=0;)//if

}//if

if(temp!=j)//if

}//if

}//for

}//do

while(area_check(r[r_n].i_start,r[r_n].i_end,r[r_n].j_start,r[r_n].j_end));

v[i][j]=true;

}//for

}//sudoku

void display()//if

else if(i==11 && j==11 && n==11)

} else if(i==12 && j==12 && n==12)}}

return false;

} else if(i==13 && j==13 && n==13)//for

}//for

int sum=rand()%40,temp;

for(;sum--!=0;)//if

}//if

if(temp!=j)//if

}//if

}//for

}//do

while(area_check(r[r_n].i_start,r[r_n].i_end,r[r_n].j_start,r[r_n].j_end));

v[i][j]=true;

}//for

}//else

else

system("cls");

for(;;)

inline std::ostream& red(std::ostream &s)

inline std::ostream& green(std::ostream &s)

inline std::ostream& yellow(std::ostream &s)

inline std::ostream& white(std::ostream &s)

struct color ;

word m_color;

};template std::basic_ostream<_elem>&

operator<& i, color& c)

// copyleft vincent godin

舞蹈鏈 精確覆蓋,解決數獨問題

首先看看數獨問題 9 9的方格 的規則 1 每個格仔只能填乙個數字 2 每行每個數字只能填一遍 3 每列每個數字只能填一遍 4 每宮每個數字只能填一遍 那現在就是利用這個規則把數獨問題轉換為精確覆蓋問題 可是,直觀上面的規則,發現比較難以轉換為精確覆蓋問題。因此,把上面的表述換個說法 1 每個格仔只...

數獨解法 C 實現

include using namespace std 構造完成標誌 bool sign false 建立數獨矩陣 int num 9 9 函式宣告 void input void output bool check int n,int key int dfs int n 主函式 int main ...

9 9數獨 C 實現

9 9數獨規則 在乙個9 9的九宮格裡面填數字,每個方格中填入合適的數字以使得每行 從左到右 每列 從上到下 以及每個九宮格 加粗線條部分 都要包含從1 9的數字。示例如下 建立9 9的數獨矩陣 注意 int型!bool flag false void input bool check int n,...