Cod sursa(job #633724)

Utilizator iulishorIulian Popescu iulishor Data 14 noiembrie 2011 17:31:04
Problema Cifra Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.69 kb
#include<fstream>
#include<algo.h>
using namespace std;
ofstream g("sudoku.out");
char v[10][10];
int a[10][10],lin[10][10],col[10][10],i,j,kk,k;
int cas[10][10],t;
void back(int kk)
{
	if(kk==70)
	{
		int i,j;
		for(i=1;i<=9;++i)
		{
			for(j=1;j<=9;++j)
				g<<a[i][j]<<" ";
			g<<"\n";
		}
		exit(0);
	}
	else
	{
		
		int i,j,k;
		for(i=1;i<=9;++i)
			for(j=1;j<=9;++j)
				if(!a[i][j])
				{
					for(k=1;k<=9;++k)
						if(!lin[i][k] && !col[k][j])
						{
							if(i<4  && j<4 && !cas[1][k])
							{
								lin[i][k]=1;
								col[k][j]=1;
								cas[1][k]=1;
								back(kk+1);
								a[i][j]=k;
								//kk--;
								a[i][j]=0;
								lin[i][k]=0;
								col[k][j]=0;
								cas[1][k]=0;
							}
							if(i<4 && j>3 && j<7 && !cas[2][k])
							{
								lin[i][k]=1;
								col[k][j]=1;
								cas[2][k]=1;
								a[i][j]=k;
								back(kk+1);
								//kk--;
								a[i][j]=0;
								lin[i][k]=0;
								col[k][j]=0;
								cas[2][k]=0;
							}
							if(i<4 && j>6 && !cas[3][k])
							{
								lin[i][k]=1;
								col[k][j]=1;
								cas[3][k]=1;
								a[i][j]=k;
								back(kk+1);
								//kk--;
								a[i][j]=0;
								lin[i][k]=0;
								col[k][j]=0;
								cas[3][k]=0;
							}
							if(i<7 && i>3 && j<4 && !cas[4][k])
							{
								lin[i][k]=1;
								col[k][j]=1;
								cas[4][k]=1;
								a[i][j]=k;
								back(kk+1);
								//kk--;
								a[i][j]=0;
								lin[i][k]=0;
								col[k][j]=0;
								cas[4][k]=0;
							}
							if(i>3 && i<7 && j>3 && j<7 && !cas[5][k])
							{
								lin[i][k]=1;
								col[k][j]=1;
								cas[5][k]=1;
								a[i][j]=k;
								back(kk+1);
								//kk--;
								a[i][j]=0;
								lin[i][k]=0;
								col[k][j]=0;
								cas[5][k]=0;
							}
							if(i<7 && i>3 && j>6 && !cas[6][k])
							{
								lin[i][k]=1;
								col[k][j]=1;
								cas[6][k]=1;
								a[i][j]=k;
								back(kk+1);
								//kk--;
								a[i][j]=0;
								lin[i][k]=0;
								col[k][j]=0;
								cas[6][k]=0;
							}
							if(i>6  && j<4 && !cas[7][k])
							{
								lin[i][k]=1;
								col[k][j]=1;
								cas[7][k]=1;
								a[i][j]=k;
								back(kk+1);
								//kk--;
								a[i][j]=0;
								lin[i][k]=0;
								col[k][j]=0;
								cas[7][k]=0;
							}
							if(i>6 && j>3 && j<7 && !cas[8][k])
							{
								lin[i][k]=1;
								col[k][j]=1;
								cas[8][k]=1;
								a[i][j]=k;
								back(kk+1);
								//kk--;
								a[i][j]=0;
								lin[i][k]=0;
								col[k][j]=0;
								cas[8][k]=0;
							}
							if(i>6 && j>6 && !cas[9][k])
							{
								lin[i][k]=1;
								col[k][j]=1;
								cas[9][k]=1;
								a[i][j]=k;
								back(kk+1);
								//kk--;
								a[i][j]=0;
								lin[i][k]=0;
								col[k][j]=0;
								cas[9][k]=0;
							}
						}
				}
	}
}
int main()
{
	ifstream f("sudoku.in");
	for(i=1;i<=9;++i)
		for(j=1;j<=9;++j)
		{	
			f>>v[i][j];
			if(v[i][j]!='0')
			{
				a[i][j]=v[i][j]-'0';
				lin[i][a[i][j]]=1;
				col[a[i][j]][j]=1;
				if(i<4  && j<4)
					cas[1][a[i][j]]=1;
				else
					if(i<4 && j>3 && j<7)
						cas[2][a[i][j]]=1;
					else
						if(i<4 && j>6)
							cas[3][a[i][j]]=1;
				if(i<7 && i>3 && j<4)
					cas[4][a[i][j]]=1;
				else
					if(i>3 && i<7 && j>3 && j<7)
						cas[5][a[i][j]]=1;
					else
						if(i<7 && i>3 && j>6)
							cas[6][a[i][j]]=1;
				if(i>6  && j<4)
					cas[7][a[i][j]]=1;
				else
					if(i>6 && j>3 && j<7)
						cas[8][a[i][j]]=1;
					else
						if(i>6 && j>6)
							cas[9][a[i][j]]=1;
				++kk;
			}
			else
				a[i][j]=0;
		}
	//back(kk);
	g<<power(7,2);
}