源.cpp
//数独计算器
//源.cpp
//Author:wzh190015
//Date:2015/12/28
#include<iostream>
#include<fstream>
#include<array>
#include<set>
#include"cell.h"
using namespace std;
array<array<cell , 9> , 9> sud;
bool changed = false;
void initsud ( ifstream& in ); //初始化盘面
void printsud ( ofstream& out ); //输出盘面
void ergodic ( cell& , array<array<cell , 9> , 9>& ); //遍历
void tryset ( int , int , int , array<array<cell , 9> , 9> ); //试设置
void fill ( array<array<cell , 9> , 9> & ); //填补
bool isfull ( array<array<cell , 9> , 9> & _sud ); //判断是否填完
void tryfill ( array<array<cell , 9> , 9>& _sud ); //试填满
int main ( void )
{
ifstream input ( "input.txt" );
ofstream output ( "output.txt" );
initsud ( input );
fill ( sud );
tryfill ( sud );
printsud ( output );
system ( "pause" );
return 0;
}
void initsud ( ifstream& in ) //初始化盘面
{
for ( int i = 0; i < 9; i++ )
{
for ( int j = 0; j < 9; j++ )
{
int n;
in >> n;
sud [ i ][ j ].setnum ( n );
sud [ i ][ j ].setpos ( i , j );
}
}
return;
}
void printsud ( ofstream& out ) //输出
{
for ( int i = 0; i < 9; i++ )
{
for ( int j = 0; j < 9; j++ )
{
out << sud [ i ][ j ].getvalue () << " ";
}
out << endl;
}
}
void ergodic ( cell& c , array<array<cell , 9> , 9>& _sud ) //遍历
{
int j1 = c.getx ();
for ( int i1 = 0; i1 < 9; i1++ )
{
_sud [ i1 ][ j1 ].mop_alt ( c.getvalue () );
}
int i2 = c.gety ();
for ( int j2 = 0; j2 < 9; j2++ )
{
_sud [ i2 ][ j2 ].mop_alt ( c.getvalue () );
}
for ( int i = 0; i < 9; i++ )
{
for ( int j = 0; j < 9; j++ )
{
if ( _sud [ i ][ j ].getboxid () == c.getboxid () )
{
_sud [ i ][ j ].mop_alt ( c.getvalue () );
}
}
}
return;
}
void tryset ( int y , int x , int _v , array<array<cell , 9> , 9> _sud ) //试设置
{
_sud [ y ][ x ].setnum ( _v );
fill ( _sud );
for ( int i = y; i < 9; i++ )
{
for ( int j = x; j < 9; j++ )
{
if ( _sud [ i ][ j ].getvalue () == 0 )
{
if ( _sud [ i ][ j ].alt.empty () )
{
return;
}
for ( auto &a : _sud [ i ][ j ].alt )
{
tryset ( i , j , a , _sud );
}
return;
}
}
}
if ( isfull ( _sud ) )
{
sud = _sud;
}
return;
}
void tryfill ( array<array<cell , 9> , 9>& _sud ) //试填满
{
for ( int i = 0; i < 9; i++ )
{
for ( int j = 0; j < 9; j++ )
{
if ( _sud [ i ][ j ].getvalue () == 0 && !( _sud [ i ][ j ].alt.empty () ) )
{
for ( auto &a : _sud [ i ][ j ].alt )
{
tryset ( j , i , a , _sud );
if ( _sud [ i ][ j ].alt.empty () )
{
return;
}
}
}
}
}
}
void fill ( array<array<cell , 9> , 9> &_sud )
{
do
{
changed = false;
for ( auto &i : _sud )
{
for ( auto &j : i )
{
if ( j.setable () )
{
j.setnum ( j.thelast () );
}
ergodic ( j , _sud );
}
}
}
while ( changed );
}
bool isfull ( array<array<cell , 9> , 9> & _sud ) //判满
{
for ( int i = 0; i < 9; i++ )
{
for ( int j = 0; j < 9; j++ )
{
if ( !_sud [ i ][ j ].getvalue () )
{
return false;
}
}
}
return true;
}
cell.h
//数独游戏
//cell.h
//Author:wzh190015
//Date:2015/12/28
#ifndef CELL_H
#define CELL_H
#include<vector>
#include<array>
using namespace std;
class cell //格子
{
friend void tryset ( int y , int x , int _v , array<array<cell , 9> , 9> _sud ); //试设置
friend void tryfill ( array<array<cell , 9> , 9>& _sud ); //试填空
public:
cell (); //构造函数
void mop_alt ( int ); //去除可能性
void setnum ( int ); //放置数字
void setpos ( int , int ); //放置座标
int getvalue (); //获取值
int getboxid (); //获取所在九宫格编号
int getx (); //获取横座标
int gety (); //获取纵座标
bool setable (); //确认填空
int thelast (); //最后一个数
private:
bool seted; //是否已经放置数字
int value; //值
vector<int> alt; //可能放置的数字
int x , y; //座标
int boxid; //所在九宫格编号
};
#endif
cell.cpp
//数独计算器
//源.cpp
//Author:wzh190015
//Date:2015/12/28
#include<iostream>
#include<fstream>
#include<array>
#include<set>
#include"cell.h"
using namespace std;
array<array<cell , 9> , 9> sud;
bool changed = false;
void initsud ( ifstream& in ); //初始化盘面
void printsud ( ofstream& out ); //输出盘面
void ergodic ( cell& , array<array<cell , 9> , 9>& ); //遍历
void tryset ( int , int , int , array<array<cell , 9> , 9> ); //试设置
void fill ( array<array<cell , 9> , 9> & ); //填补
bool isfull ( array<array<cell , 9> , 9> & _sud ); //判断是否填完
void tryfill ( array<array<cell , 9> , 9>& _sud ); //试填满
int main ( void )
{
ifstream input ( "input.txt" );
ofstream output ( "output.txt" );
initsud ( input );
fill ( sud );
tryfill ( sud );
printsud ( output );
system ( "pause" );
return 0;
}
void initsud ( ifstream& in ) //初始化盘面
{
for ( int i = 0; i < 9; i++ )
{
for ( int j = 0; j < 9; j++ )
{
int n;
in >> n;
sud [ i ][ j ].setnum ( n );
sud [ i ][ j ].setpos ( i , j );
}
}
return;
}
void printsud ( ofstream& out ) //输出
{
for ( int i = 0; i < 9; i++ )
{
for ( int j = 0; j < 9; j++ )
{
out << sud [ i ][ j ].getvalue () << " ";
}
out << endl;
}
}
void ergodic ( cell& c , array<array<cell , 9> , 9>& _sud ) //遍历
{
int j1 = c.getx ();
for ( int i1 = 0; i1 < 9; i1++ )
{
_sud [ i1 ][ j1 ].mop_alt ( c.getvalue () );
}
int i2 = c.gety ();
for ( int j2 = 0; j2 < 9; j2++ )
{
_sud [ i2 ][ j2 ].mop_alt ( c.getvalue () );
}
for ( int i = 0; i < 9; i++ )
{
for ( int j = 0; j < 9; j++ )
{
if ( _sud [ i ][ j ].getboxid () == c.getboxid () )
{
_sud [ i ][ j ].mop_alt ( c.getvalue () );
}
}
}
return;
}
void tryset ( int y , int x , int _v , array<array<cell , 9> , 9> _sud ) //试设置
{
_sud [ y ][ x ].setnum ( _v );
fill ( _sud );
for ( int i = y; i < 9; i++ )
{
for ( int j = x; j < 9; j++ )
{
if ( _sud [ i ][ j ].getvalue () == 0 )
{
if ( _sud [ i ][ j ].alt.empty () )
{
return;
}
for ( auto &a : _sud [ i ][ j ].alt )
{
tryset ( i , j , a , _sud );
}
return;
}
}
}
if ( isfull ( _sud ) )
{
sud = _sud;
}
return;
}
void tryfill ( array<array<cell , 9> , 9>& _sud ) //试填满
{
for ( int i = 0; i < 9; i++ )
{
for ( int j = 0; j < 9; j++ )
{
if ( _sud [ i ][ j ].getvalue () == 0 && !( _sud [ i ][ j ].alt.empty () ) )
{
for ( auto &a : _sud [ i ][ j ].alt )
{
tryset ( j , i , a , _sud );
if ( _sud [ i ][ j ].alt.empty () )
{
return;
}
}
}
}
}
}
void fill ( array<array<cell , 9> , 9> &_sud )
{
do
{
changed = false;
for ( auto &i : _sud )
{
for ( auto &j : i )
{
if ( j.setable () )
{
j.setnum ( j.thelast () );
}
ergodic ( j , _sud );
}
}
}
while ( changed );
}
bool isfull ( array<array<cell , 9> , 9> & _sud ) //判满
{
for ( int i = 0; i < 9; i++ )
{
for ( int j = 0; j < 9; j++ )
{
if ( !_sud [ i ][ j ].getvalue () )
{
return false;
}
}
}
return true;
}