學長您好 我不曉得為甚麼我改成多冊資輸入+每輸入一回會自動更新紀錄的值,但上傳ZJ是WA,請求協助
[C++] 純文本查看 復制代碼 #include<iostream>
using namespace std;
int n,sudoku[9][9],N;
int ok[9][9][9];
void init_ok(void)
{
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
for(int k=0;k<9;k++) ok[i][j][k]=0;
}
}
}
void modify(int x,int y,int i,int w)
{
for(int j=0;j<N;j++)
{
ok[y][j][i]+=w;
ok[j][x][i]+=w;
}
int a=(y/n)*n;
int b=(x/n)*n;
for(int l=a;l<a+n;l++)
{
for(int m=b;m<b+n;m++)
{
ok[l][m][i]+=w;
}
}
}
bool solve(void)
{
int z_min=10,x,y,a,b;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
if(sudoku[i][j]==0)
{
int z=0;
for(int k=0;k<N;k++)
{
if(ok[i][j][k]==0) z++;
}
if(z_min>z)
{
y=i;
x=j;
z_min=z;
}
}
}
}
if(z_min==10) return true;
if(z_min==0) return false;
else
{
for(int i=0;i<N;i++)
{
if(ok[y][x][i]==0)
{
sudoku[y][x]=i+1;
modify(x,y,i,1);
if(solve()) return true;
else
{
sudoku[y][x]=0;
modify(x,y,i,-1);
}
}
}
return false;
}
}
int main()
{
while(cin>>n)
{
N=n*n;
init_ok();
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
cin>>sudoku[i][j];
}
}
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
if(sudoku[i][j]!=0)
{
modify(j,i,sudoku[i][j]-1,1);
}
}
}
if(solve()==false) cout<<"NO SOLUTION\n";
else
{
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++) cout<<sudoku[i][j]<<' ';
cout<<"\n";
}
}
}
return 0;
}
愛用插入代碼...
By Sylveon |