2WA+8TLE 求助
#include <bits/stdc++.h>
using namespace std;
int vis[20][20];
bool have[20][20];
int n,cnt;
void init(int x,int y)
{
vis[x][y]++;
for(int i=1;i<=n;i++)
{
vis[x][i]++;
vis[i][y]++;
}
int P=x,Q=y;
while(1)
{
if(x+1>n||y+1>n||x+1<1||y+1<1) break;
vis[++x][++y]++;
}
x=P,y=Q;
while(1)
{
if(x-1>n||y-1>n||x-1<1||y-1<1) break;
vis[--x][--y]++;
}
x=P,y=Q;
while(1)
{
if(x+1>n||x+1<1||y-1>n||y-1<1) break;
vis[++x][--y]++;
}
x=P,y=Q;
while(1)
{
if(x-1>n||x-1<1||y+1>n||y+1<1) break;
vis[--x][++y]++;
}
}
void init2(int x,int y)
{
vis[x][y]--;
for(int i=1;i<=n;i++)
{
vis[x][i]--;
vis[i][y]--;
}
int P=x,Q=y;
while(1)
{
if(x+1>n||y+1>n||x+1<1||y+1<1) break;
vis[++x][++y]--;
}
x=P,y=Q;
while(1)
{
if(x-1>n||y-1>n||x-1<1||y-1<1) break;
vis[--x][--y]--;
}
x=P,y=Q;
while(1)
{
if(x+1>n||x+1<1||y-1>n||y-1<1) break;
vis[++x][--y]--;
}
x=P,y=Q;
while(1)
{
if(x-1>n||x-1<1||y+1>n||y+1<1) break;
vis[--x][++y]--;
}
}
void dfs(int pos)
{
if(pos>n)
{
cnt++;
if(cnt<=3)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(have[i][j]) cout<<j<<" ";
}
}
cout<<"\n";
}
return;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(!vis[i][j])
{
have[i][j]=true;
init(i,j);
dfs(pos+1);
init2(i,j);
have[i][j]=false;
}
}
}
}
int main()
{
cin>>n;
dfs(1);
cout<<cnt<<"\n";
return 0;
}