如题,如果仅求一个解的话用dfs+贪心即可实现100 * 100以内的求解,但如果要求所有解的话,即便是6 * 6的棋盘,也要跑将近10分钟(5 * 5可以秒出)。
请问各位大神有没有好的办法(给定起始坐标)。。
下面是我的跑一个解的代码:
#include<cstdio>
#include<algorithm>
using namespace std;
int n,a,b,flag,v[1200][1200],ans;
int fx[10][2]={{0,0},{1,2},{2,1},{1,-2},{2,-1},{-1,2},{-2,1},{-1,-2},{-2,-1}};
struct ns{int step,x,y;}s[10];
bool cmp(ns a,ns b){return a.step<b.step;}
int sum(int x,int y)
{
if(v[x][y]||x<1||x>n||y<1||y>n) return -1;
int ans=0;
for(int i=1;i<=8;i++)
{
int nx=x+fx[i][0],ny=y+fx[i][1];
if(!v[nx][ny]&&1<=nx&&nx<=n&&1<=ny&&ny<=n) ans++;
}
return ans;
}
void dfs(int k,int x,int y)
{
//if(flag==1) return;
if(k>n*n)
{
/*for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if(v[i][j]<10) printf("00");
else if(v[i][j]<100) printf("0");
printf("%d ",v[i][j]);
if(j==n) printf("\n");
}
printf("\n");*/
ans++;return;
}
for(int i=1;i<=8;i++)
{
int nx=x+fx[i][0],ny=y+fx[i][1];
//s[i].step=sum(nx,ny);
//s[i].x=nx,s[i].y=ny;
if(!v[nx][ny]&&1<=nx&&nx<=n&&1<=ny&&ny<=n)
v[nx][ny]=k,dfs(k+1,nx,ny),v[nx][ny]=0;
}
/*sort(s+1,s+9,cmp);
int t[10][3];
for(int i=1;i<=8;i++)
t[i][0]=s[i].step,t[i][1]=s[i].x,t[i][2]=s[i].y;
for(int i=1;i<=8;i++)
if(t[i][0]!=-1)
{
v[t[i][1]][t[i][2]]=k;
dfs(k+1,t[i][1],t[i][2]);
v[t[i][1]][t[i][2]]=0;
}*/
return;
}
int main()
{
scanf("%d%d%d",&n,&a,&b);
v[a][b]=1;dfs(2,a,b);
printf("%d\n",ans);
return 0;
}