源.cpp
#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
#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
#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;
}