第归写错了
# 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();
}

解决方案 »

  1.   

        你们写程序,为什么不把格式写漂亮些呢?
        对不住自己没关系,可要对的起别人啊!请用缩进格式!
    先帮你把格式改好,等我有空再看看:
    # 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();
    }
    改得真累,记得下次写的时候就这样!这看起来清楚多了!
      

  2.   

    冤枉!!!在我的机器上是没问题的,可能是tab键引起的缩进不认
      

  3.   

    你的程序太麻烦,我来写了一个,大家比比看:
    /*你需要求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]