| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:实测剪枝dfs可过In Reply To:附上强剪条件 Posted by:damacheng009 at 2010-10-26 15:49:26 就是楼上说的两种。。。正推和反算即可。。。帖份代码给不想dance的同学们研究下吧。。。
这里说的对剪枝蛮有启发。。。http://www.sudokufans.org.cn/forums/topic/8/
#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;
struct node{
int x;
int y;
int option;
bool optionList[9];
};
int table[9][9];
bool row[9][9];
bool col[9][9];
bool block[9][9];
node order[81];
int cmp(const node& a, const node& b) {
return a.option < b.option;
}
void init() {
memset(row, 0, sizeof(row));
memset(col, 0, sizeof(col));
memset(block, 0, sizeof(block));
for(int i = 0; i < 9; i++) {
for(int j = 0; j < 9; j++) {
if(table[i][j] != 0) {
row[i][table[i][j]-1] = true;
col[j][table[i][j]-1] = true;
block[i/3*3 + j/3][table[i][j]-1] = true;
}
}
}
}
void updateOption(int l) {
int rowOption[9][9] = {};
int colOption[9][9] = {};
int blockOption[9][9] = {};
for(int index = 0; index < l; index++) {
int i = order[index].x;
int j = order[index].y;
if(table[i][j] == 0) {
order[index].option = 0;
memset(order[index].optionList, 0, sizeof(order[index].optionList));
for(int k = 0; k < 9; k++) {
if(!row[i][k] && !col[j][k] && !block[i/3*3 + j/3][k]) {
order[index].option++;
order[index].optionList[k] = true;
rowOption[i][k]++;
colOption[j][k]++;
blockOption[i/3*3 + j/3][k]++;
}
}
}
}
for(int n = 0; n < 9; n++) {
for(int k = 0; k < 9; k++) {
if(rowOption[n][k] == 1) {
for(int index = 0; index < l; index++) {
if(table[order[index].x][order[index].y] == 0) {
if(order[index].x == n && order[index].optionList[k]) {
order[index].option = 1;
memset(order[index].optionList, 0, sizeof(order[index].optionList));
order[index].optionList[k] = true;
}
}
}
}
if(colOption[n][k] == 1) {
for(int index = 0; index < l; index++) {
if(table[order[index].x][order[index].y] == 0) {
if(order[index].y == n && order[index].optionList[k]) {
order[index].option = 1;
memset(order[index].optionList, 0, sizeof(order[index].optionList));
order[index].optionList[k] = true;
}
}
}
}
if(blockOption[n][k] == 1) {
for(int index = 0; index < l; index++) {
if(table[order[index].x][order[index].y] == 0) {
if(order[index].x/3*3 + order[index].y/3 == n && order[index].optionList[k]) {
order[index].option = 1;
memset(order[index].optionList, 0, sizeof(order[index].optionList));
order[index].optionList[k] = true;
}
}
}
}
}
}
}
int getOrder() {
memset(order, 0, sizeof(order));
int index = 0;
for(int i = 0; i < 9; i++) {
for(int j = 0; j < 9; j++) {
if(table[i][j] == 0) {
order[index].x = i;
order[index].y = j;
index++;
}
}
}
updateOption(index);
return index;
}
void inputOne(int i, int j, int k) {
row[i][k] = true;
col[j][k] = true;
block[i/3*3+j/3][k] = true;
table[i][j] = k+1;
}
void outputOne(int i, int j, int k) {
row[i][k] = false;
col[j][k] = false;
block[i/3*3+j/3][k] = false;
table[i][j] = 0;
}
int getIndex(int l) {
int option = 10;
int res = -1;
for(int index = 0; index < l; index++) {
int i = order[index].x;
int j = order[index].y;
if(table[i][j] == 0) {
if(order[index].option < option) {
option = order[index].option;
res = index;
}
}
}
if(option == 0) {
return -1;
}
else {
return res;
}
}
bool dfs(int cnt, int l) {
if(cnt == l)
return true;
int index = getIndex(l);
if(index == -1)
return false;
int i = order[index].x;
int j = order[index].y;
for(int k = 0; k < 9; k++) {
if(order[index].optionList[k]) {
inputOne(i, j, k);
updateOption(l);
if(dfs(cnt + 1, l)) {
return true;
}
outputOne(i, j, k);
updateOption(l);
}
}
return false;
}
int main() {
char tmp[82] = {};
while(scanf("%s", tmp) && strcmp(tmp, "end") != 0) {
for(int i = 0; i < 9; i++) {
for(int j = 0; j < 9; j++) {
if(tmp[i*9 + j] == '.') {
table[i][j] = 0;
}
else {
table[i][j] = tmp[i*9 + j] - '0';
}
}
}
init();
int l = getOrder();
dfs(0, l);
for(int i = 0; i < 9; i++) {
for(int j = 0; j < 9; j++) {
printf("%d", table[i][j]);
}
}
printf("\n");
}
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator