#include <iostream>
#include <list>
using namespace std;
int map[9][9]={
4,0,0,0,0,2,0,0,9,
9,5,8,0,0,3,7,0,0,
2,0,7,5,0,0,4,0,0,
0,0,0,0,0,0,0,1,0,
1,9,2,0,3,0,0,4,5,
0,4,0,0,0,0,0,0,0,
0,0,9,0,0,6,2,0,4,
0,2,4,3,0,0,8,9,6,
6,0,0,2,0,0,0,0,0
};
int count;
struct Point
{
int i;
int j;
};
int row[9];
int col[9];
int block[9];
list<Point> spaces;
void Print(int a[][9])
{
for(int i = 0;i < 9;i++)
{
for(int j = 0;j < 9;j++)
{
cout<<a[i][j]<<' ';
}
cout<<endl;
}
}
/**
* 提取空格,保存到spaces链表
* 标记行、列、块的候选数
*/
void PickUp()
{
int t;
Point p;
for(int i = 0;i < 9;i++)
{
for(int j = 0;j < 9;j++)
{
t = map[i][j] - 1;
if(t < 0)
{
p.i = i;
p.j = j;
spaces.push_back(p);
}
else
{
t = 0x01 << t;
row[i] |= t;
col[j] |= t;
block[i/3*3 + j/3] |= t;
}
}
}
}
/**
* 返回下一个候选数
*/
int next(Point& p,int d)
{
int mark = ~(row[p.i] | col[p.j] | block[p.i/3*3 + p.j/3]);
mark >>= d;
while(d < 9)
{
d++;
if(mark & 0x01)
return d;
mark >>= 1;
}
return -1;
}
/**
* 设置某一格所在行、列、块的标记
*/
void set(Point& p)
{
int t = map[p.i][p.j] - 1;
if(t < 0)
{
cout<<"设置某一格所在行、列、块的标记错误,("<<p.i<<","<<p.j<<")=0"<<endl;
exit(-1);
return ;
}
t = 0x01 << t;
row[p.i] |= t;
col[p.j] |= t;
block[p.i/3*3 + p.j/3] |= t;
}
void reset(Point& p)
{
int t = map[p.i][p.j] - 1;
if(t < 0)
{
cout<<"设置某一格所在行、列、块的标记错误,("<<p.i<<","<<p.j<<")=0"<<endl;
exit(-1);
return ;
}
t = ~(0x01 << t);
row[p.i] &= t;
col[p.j] &= t;
block[p.i/3*3 + p.j/3] &= t;
}
void Solve(list<Point>::iterator& it)
{
if(it == spaces.end())
{
Print(map);
count++;
return;
}
//获得该处下一个候选数
int d = next(*it,0);
list<Point>::iterator next_it(it);
++next_it;
- 潘增弗:<img src="image/face/2.gif" class="face">
- smallado:读了你的文章好醒悟啊~我现在还在大二 ,一直比较茫然 不知道干什么。时间真的很快 ,现在我已经...
- lucky563591:所以我要抓住机会向她表白。
- 心兒:双子的悲伤,无人能懂
- 星格格:各有姻缘,不可强求。
- s912360101:以前我也有一个这样的女孩。我们之间的差距,注定无缘。我有我的梦想。她有她的家!