有没有办法可以快速得到马踏棋盘问题的所有解?
  • 板块学术版
  • 楼主林聪
  • 当前回复18
  • 已保存回复18
  • 发布时间2020/8/8 12:00
  • 上次更新2023/11/6 20:57:15
查看原帖
有没有办法可以快速得到马踏棋盘问题的所有解?
69796
林聪楼主2020/8/8 12:00

如题,如果仅求一个解的话用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;
}
2020/8/8 12:00
加载中...