2676Sudoku

这个题自己写的样例能过,但是提交总是output limit exceed。还没想明白到底哪里错了,
走过路过的帮忙看看哪里出问题?
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a[20][20],n;
int hen[10][10],shu[10][10],kuai[10][10];
struct M
{
int x,y,k;
}s[1300];
int f(int xx,int yy)
{
if(xx>=1&&xx<=3&&yy>=1&&yy<=3)return 1;
else if(xx>=4&&xx<=6&&yy>=1&&yy<=3)return 4;
else if(xx>=7&&xx<=9&&yy>=1&&yy<=3)return 7;
else if(xx>=1&&xx<=3&&yy>=4&&yy<=6)return 2;
else if(xx>=4&&xx<=6&&yy>=4&&yy<=6)return 5;
else if(xx>=7&&xx<=9&&yy>=4&&yy<=6)return 8;
else if(xx>=1&&xx<=3&&yy>=7&&yy<=9)return 3;
else if(xx>=4&&xx<=6&&yy>=7&&yy<=9)return 6;
else if(xx>=7&&xx<=9&&yy>=7&&yy<=9)return 9;
}

int dfs(int nn)
{
int i,j,k,g;
k=0;

if(nn==-1)
{
for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
{
cout<<a[i][j];
}cout<<endl;
}
return 0;
}
else
{
for(i=1;i<=9;i++)
{

if(hen[s[nn].x][i]==1||shu[s[nn].y][i]==1||kuai[s[nn].k][i]==1||a[s[nn].x][s[nn].y]!=0)continue;
if(hen[s[nn].x][i]==0&&shu[s[nn].y][i]==0&&kuai[s[nn].k][i]==0&&a[s[nn].x][s[nn].y]==0)
{


//cout<<s[nn].x<<" "<<s[nn].y<<" "<<i<<" "<<nn<<endl;
a[s[nn].x][s[nn].y]=i;
hen[s[nn].x][i]=1;shu[s[nn].y][i]=1;kuai[s[nn].k][i]=1;
dfs(nn-1);

a[s[nn].x][s[nn].y]=0;
hen[s[nn].x][i]=0;shu[s[nn].y][i]=0;kuai[s[nn].k][i]=0;
}

}
}
return 0;
}
main()
{
int cases,i,j,kk;
scanf("%d",&cases);

char c;
for(int tt=0;tt<cases;tt++)
{
memset(a,0,sizeof(a));
memset(s,0,sizeof(s));
memset(hen,0,sizeof(hen));
memset(shu,0,sizeof(shu));
memset(kuai,0,sizeof(kuai));
n=0;

for(i=1;i<=9;i++)
{
for(j=1;j<=9;j++)
{
cin>>c;
//if(c>='0'&&c<='9')
a[i][j]= c-'0';
kk=f(i,j);

hen[i][a[i][j]]=1;
shu[j][a[i][j]]=1;
kuai[kk][a[i][j]]=1;
if(a[i][j]==0)
{
s[n].k=kk;
s[n].x=i;s[n].y=j;n=n+1;
}
}
}


dfs(n-1);


}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值