第归写错了
# include <iostream.h>int [8][8];//标记每格,初始为0
int row[8];//row定义每行的位置,初始为0void Mark(int r,int c)
{//放子后相应四个方向作记号
if(r<8&&c<8&&r>=0&&c>=0)
{ for(int i=0;i<8;i++)//竖行
[i][c]++;
for(i=0;i<8;i++)//横行
[r][i]++;
int j;
for(i=r,j=c;i<8&&j<8;i++,j++)//左上到右下
[i][j]++;
for(i=r,j=c;i>=0&&j>=0;i--,j--)
[i][j]++;
for(i=r,j=c;j>=0&&i<8;j--,i++)//右上到左下
[i][j]++;
for(i=r,j=c;i>=0&&j<8;i--,j++)
[i][j]++;
[r][c]-=5;//落子处记号多作,删去
}
}void DeleteMark(int r,int c)
{//子抽掉后相应行列删去记号,对应同上
if(r<8&&c<8&&r>=0&&c>=0)
{
for(int i=0;i<8;i++)
[i][c]--;
for(i=0;i<8;i++)
[r][i]--;
int j;
for(i=r,j=c;i<8&&j<8;i++,j++)
[i][j]--;
for(i=r,j=c;i>=0&&j>=0;i--,j--)
[i][j]--;
for(i=r,j=c;j>=0&&i<8;j--,i++)
[i][j]--;
for(i=r,j=c;i>=0&&j<8;i--,j++)
[i][j]--;
[r][c]+=5;
}
}void Search(int k)
{
int j=0;
for(j=0;j<8;j++)
{
if([k][j]==0)//空格,可放子
{
row[k]=j;
Mark(k,j);//作记号
if(k>7)//到最后一行
{
for(int i1=0;i1<8;i1++)
cout<<i1<<" "<<row[i1]<<",";
cout<<endl; //输出结果
return;
}
Search(k+1);
DeleteMark(k,j);
}
}
}
void Queen()
{ //初始记号都记为0
for(int i=0;i<8;i++)
{ row[i]=0;
for(int j=0;j<8;j++)
[i][j]=0;
}
int k=0;
int counts=0;
//调用递归函数
Search(k);
}void main()
{ Queen();
}
# include <iostream.h>int [8][8];//标记每格,初始为0
int row[8];//row定义每行的位置,初始为0void Mark(int r,int c)
{//放子后相应四个方向作记号
if(r<8&&c<8&&r>=0&&c>=0)
{ for(int i=0;i<8;i++)//竖行
[i][c]++;
for(i=0;i<8;i++)//横行
[r][i]++;
int j;
for(i=r,j=c;i<8&&j<8;i++,j++)//左上到右下
[i][j]++;
for(i=r,j=c;i>=0&&j>=0;i--,j--)
[i][j]++;
for(i=r,j=c;j>=0&&i<8;j--,i++)//右上到左下
[i][j]++;
for(i=r,j=c;i>=0&&j<8;i--,j++)
[i][j]++;
[r][c]-=5;//落子处记号多作,删去
}
}void DeleteMark(int r,int c)
{//子抽掉后相应行列删去记号,对应同上
if(r<8&&c<8&&r>=0&&c>=0)
{
for(int i=0;i<8;i++)
[i][c]--;
for(i=0;i<8;i++)
[r][i]--;
int j;
for(i=r,j=c;i<8&&j<8;i++,j++)
[i][j]--;
for(i=r,j=c;i>=0&&j>=0;i--,j--)
[i][j]--;
for(i=r,j=c;j>=0&&i<8;j--,i++)
[i][j]--;
for(i=r,j=c;i>=0&&j<8;i--,j++)
[i][j]--;
[r][c]+=5;
}
}void Search(int k)
{
int j=0;
for(j=0;j<8;j++)
{
if([k][j]==0)//空格,可放子
{
row[k]=j;
Mark(k,j);//作记号
if(k>7)//到最后一行
{
for(int i1=0;i1<8;i1++)
cout<<i1<<" "<<row[i1]<<",";
cout<<endl; //输出结果
return;
}
Search(k+1);
DeleteMark(k,j);
}
}
}
void Queen()
{ //初始记号都记为0
for(int i=0;i<8;i++)
{ row[i]=0;
for(int j=0;j<8;j++)
[i][j]=0;
}
int k=0;
int counts=0;
//调用递归函数
Search(k);
}void main()
{ Queen();
}
对不住自己没关系,可要对的起别人啊!请用缩进格式!
先帮你把格式改好,等我有空再看看:
# include <iostream.h>int [8][8]; //标记每格,初始为0
int row[8]; //row定义每行的位置,初始为0void Mark(int r,int c)
{ //放子后相应四个方向作记号
if(r<8&&c<8&&r>=0&&c>=0)
{ for(int i=0;i<8;i++)//竖行
[i][c]++;
for(i=0;i<8;i++) //横行
[r][i]++; int j; for(i=r,j=c;i<8&&j<8;i++,j++)//左上到右下
[i][j]++;
for(i=r,j=c;i>=0&&j>=0;i--,j--)
[i][j]++;
for(i=r,j=c;j>=0&&i<8;j--,i++)//右上到左下
[i][j]++;
for(i=r,j=c;i>=0&&j<8;i--,j++)
[i][j]++;
[r][c]-=5;//落子处记号多作,删去
}
}void DeleteMark(int r,int c)
{ //子抽掉后相应行列删去记号,对应同上
if(r<8&&c<8&&r>=0&&c>=0)
{
for(int i=0;i<8;i++)
[i][c]--;
for(i=0;i<8;i++)
[r][i]--; int j; for(i=r,j=c;i<8&&j<8;i++,j++)
[i][j]--;
for(i=r,j=c;i>=0&&j>=0;i--,j--)
[i][j]--;
for(i=r,j=c;j>=0&&i<8;j--,i++)
[i][j]--;
for(i=r,j=c;i>=0&&j<8;i--,j++)
[i][j]--;
[r][c]+=5;
}
}void Search(int k)
{
int j=0;
for(j=0;j<8;j++)
{
if([k][j]==0) //空格,可放子
{
row[k]=j;
Mark(k,j); //作记号
if(k>7) //到最后一行
{
for(int i1=0;i1<8;i1++)
cout<<i1<<" "<<row[i1]<<",";
cout<<endl; //输出结果
return;
}
Search(k+1);
DeleteMark(k,j);
}
}
}
void Queen() //初始记号都记为0
{
for(int i=0;i<8;i++)
{
row[i]=0;
for(int j=0;j<8;j++)
[i][j]=0;
} int k=0;
int counts=0;
Search(k); //调用递归函数
}void main()
{
Queen();
}
改得真累,记得下次写的时候就这样!这看起来清楚多了!
/*你需要求N皇后问题,只需要把程序中的4替换成你需要的N就可以了。这个程序已经验证过了,直接运行。*/
#include <iostream.h>
void allocation(int i,int n);//分配位置
bool palace[4][4];//宫殿分布
int position[4];//保存位置进行比较
void main(){
int i,j;
//初始化
for (i=0;i<4;i++){
position[i]=-1;
for (j=0;j<4;j++) palace[i][j]=0;
}
allocation(0,4);
}void allocation(int i,int n){
int j,k;
bool judge=1;
if (i>=n){
//分配成功,输出一种方案
cout<<"下面是一种方案:\n";
for (j=0;j<4;j++) {
for (k=0;k<4;k++){
if (palace[j][k]) cout<<"1 ";
else cout<<" ";
}
cout<<endl;
}
}
else {
for (j=0;j<n;j++){
palace[i][j]=1;
position[i]=j;
judge=1;
for (k=0;k<i;k++){
//如果k皇后还没有分配位置就不进行比较
if (position[k]<0) continue;
//判断新加入的皇后是否合乎要求
if ((position[k]==j)||((k+1==i)&&((position[k]+1==j)||(position[k]-1==j)))){
judge=0;
break;
}
}
//合乎要求进行下一个皇后的分配
if (judge) allocation(i+1,n);
//不合乎要求就回收位置,另外选一个位置重新分配
palace[i][j]=0;
position[i]=-1;
}
}
}
如果觉得有问题或者有想法,可以和我联络:[email protected]