⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 011.cpp

📁 包含两个文件
💻 CPP
字号:
#include<iostream.h>
#include<time.h>
#include<stdlib.h>
void main()
{ int n,flag=0,l=0,g[20];
  clock_t start_time,end_time;
  cout<<"请输入要求解的皇后数";
  cout<<endl<<"n=";
  cin>>n;
  int *col,*md,*sd,*q,m,pp=0;
  col=new int[n]; if(!col) exit(0);// 数组,各列有无皇后(0,1)     
    md=new int[2*n-1]; if(!md) exit(0); //数组,各主对角线有无皇后(0,1)
    sd=new int[2*n-1]; if(!sd) exit(0);//数组,各次对角线有无皇后(0,1)
    q=new int[n]; if(!q) exit(0);//数组,第i行上皇后在第几列(0,n-1)
  int i,j,k=0,w;
//  int i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15,i16,i17,i18,i19;
  for(i=0;i<n;i++) col[i]=q[i]=0;
    for(i=0;i<2*n-1;i++) md[i]=sd[i]=0;
	 for(i=0;i<20;i++)g[i]=0;
	   j=0;
	   start_time=clock();//cout<<start_time<<endl;
loop1:	  for(i=0;i<n;i++)
	  {   //cout<<"i="<<i<<" "<<j;
		  flag=0;
		  if(j == 0) 
	  { for(w=0;w<n;w++) col[w]=q[w]=0;
        for(w=0;w<2*n-1;w++) md[w]=sd[w]=0;
	  }
	    if(!col[i]&&!md[n+i-j-1]&&!sd[i+j])//1
		  {
			col[i]=md[n+i-j-1]=sd[i+j]=1;
		    q[j]=i;//cout<<i;
		    j++;
		}
		else if(i < n-1)continue;
		else if(i == n-1)
		{ 
			if(!col[i]&&!md[n+i-j-1]&&!sd[i+j])
		{
				col[i]=md[n+i-j-1]=sd[i+j]=1;
		        j++;
		        q[j]=i;

		} else 
			{  i=q[j-1];
loop2:		        if(i == n-1)
				{   
			      if(j>1)
				   {
				   i=q[j-2];
				   j=j-2;
                    col[i]=md[n+i-j-1]=sd[i+j]=0;
			        m=q[j+1];
			        col[m]=md[n+m-j-2]=sd[m+j+1]=0;
		        	flag=1;
				  }else if(j == 1)
				  {i=q[j-1];
				  col[i]=md[n+i-j-1]=sd[i+j]=0;
				  flag=1;
				  }else if((j ==0 ) && (i == n-1))goto loop;else 
					  goto loop1;
				}
				else
				{ 
		              if(j>0)
					  { j--;
		          //    q[j]=0;
			          col[i]=md[n+i-j-1]=sd[i+j]=0;			
					  flag=1;}else if((j == 0) && (i == n-1))goto loop;
					  else 
						  goto loop1;
				}
		} 
		}                                          //1
		if(flag == 1)continue;
		else
		{
		     if(j == n)
			 {  
			   k++;
			   if(n%2 == 0)
			   {if(q[0] == n/2)
			   { for(m=0;m<n;m++)g[m]=n-q[m];
				  k=k-1;
				  goto loop;
			   }else ;
			   }
			   else
			   {if((q[0]==n/2)&&(q [1]> n/2))
			   { for(m=0;m<n;m++)g[m]=n-q[m];
					   k=k-1;
					   goto loop;
			   }else ;
			   }
		        m=q[n-2];
		        col[m]=md[n+m-j+1]=sd[m+j-2]=0;
		        col[i]=md[n+i-j]=sd[i+j-1]=0;
				q[n-1]=0;
				q[n-2]=0;
		        j=j-2;
				i=m;
				if(i == n-1){i=q[j-1]; goto loop2;}
				
			 }
			 else {if(j < n)  i=-1;}
		}
	}
loop:	  end_time=clock();
	  cout<<"n="<<n<<"共有"<<k*2<<"个解"<<endl;
	  cout<<"用的时间是"<<end_time-start_time<<endl;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -