Chinaunix首页 | 论坛 | 博客
  • 博客访问: 29161
  • 博文数量: 16
  • 博客积分: 600
  • 博客等级: 上士
  • 技术积分: 170
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-21 13:21
文章分类

全部博文(16)

文章存档

2011年(1)

2008年(15)

我的朋友
最近访客

分类: C/C++

2008-03-10 22:07:22

#include<iostream.h>
#include<math.h>
void EightQueen()
{
    int n;
    
    cout<<"输入这个棋盘的大小"<<endl;
    cin>>n;
    int queen[n];
    int total=0;//计数器
    
    int j,k;
    for(int r=0;r<n;r++) queen[r]=0;//皇后全放在第0列,要知道这个语句一执行的话,这个棋盘就是存在了,后面的相当于对这个盘进行的修改,不要以为它是个没有满的盘.
    for(int i=1; ;)//这是个无条件下的循环,判断时当然从第二行作为判断的起点,这个循环是由else 中的return 退出的
    {
         if(queen[i]<8)//列标没有达到最右端,等于7时还要判断,是以这个作为回溯判断
         {
             k=0;//检查与第k个皇后是否互相攻击,这里只是对一个结果的判断而已
             while(k<i && (queen[k]-queen[i]) && (abs(queen[k]-queen[i])-abs(k-i))) k++;//同行同列的特点
             if(k<=i-1)//若没有攻击,则最后的k要等于i(即对第i个皇后放置后,要从头检查直到i-1个),否则就是小于i
             {
                 queen[i]++;//第i个皇后就要右移一格,重新开始测试
                 continue;
             }
             i++;//如果是没有冲突的话,就会重新回到循环,要知道第二for语句的int i=1;是不会再执行的,它只是一个初始化而已
               if(i<n) {continue;}//还没有到最后一行,就算i=7;这时我们还要测试这一行,i=7时这一行并没有测试它
             for(j=0;j<n;j++)
             {cout<<queen[j];}//若只有一行,这样写的可读性要好
             cout<<" ";
             total++;
             if(total%3==0) cout<<endl;
                 queen[7]++;//我们说过:i=7时这一行并没有测试它一样,这时虽找到一个,并没有全部测试完
             i=7;//这是确保找到一个结果后,顺着它找到同宗同根的结果,当然这个结果数字相同的部分会越来越少
         }
         else
         {
             //就会重新回到循环,要知道第二for语句的int i=1;是不会再执行的,它只是一个初始化而已
             queen[i]=0;//当前皇后回归到0列
             i--;//回溯到前一行皇后
             if(i<0)
             {
                 cout<<"总数:"<<total<<endl;
                     return;//表示连第一行的最后一个位置都不能成立了.再也不能回溯了.由它退出函数
             }
             else queen[i]++;//前一行皇后右移一列
         }
    }
}

阅读(455) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~