📄 n皇后问题.cpp
字号:
#include<iostream.h>
#include<stdlib.h>
int **a;
int *h;
bool put(int i,int j,int n)
{
int r,s;
for(r=0;r<n;r++)
{
for(s=0;s<n;s++)
{
if(a[i][r]==1||a[s][j]==1){break;}
if( (((r+s)==(i+j)) || ((r-s)==(i-j)) )&&(a[r][s]==1)){break;}
}
if(s!=n)break;//充分说明了在循环体里定义的变量出了循环体就不能用。
}
if(r!=n||s!=n)return false;
else return true;
}
void trial(int i,int n)
{
int j;
if(i>n-1)
{
cout<<"the site of the queen is"<<endl;
for(int p=0;p<n;p++)
{
for(int q=0;q<n;q++)
{
if(a[p][q]==1)cout<<p<<q;
}
cout<<endl;
}
char v;
cout<<"if you want to continue,please put in Y/y"<<endl;
cin>>v;
if(v=='y'||v=='Y')
{
i=i-1;int z=h[i];
a[i][z]=0;
}
else exit(2);
}
else
{
for(j=0;j<n;j++)
{
if(put(i,j,n))
{
a[i][j]=1;h[i]=j;
trial(i+1,n);
}
}
if(j==n)
{
if(i>0)
{
i=i-1;int z=h[i];
a[i][z]=0;
}
else
cout<<"search has been finished!"<<endl;
}//递归也要返回到原状态。。很郁闷,是程序设计的问题??
}
}
void main()
{
int n;
cout<<"please put in the number of the queen"<<endl;
cin>>n;
a=new int*[n];
h=new int[n];
int i=0;
for(int p=0;p<n;p++)
{
a[p]=new int[n];
for(int q=0;q<n;q++)
{a[p][q]=0;}
}
trial(i,n);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -