八皇後問題,求教


我用遞歸編了一種算法,能編譯通過,可打印不出來,請哪位高手指教:
代碼如下:
  #include<iostream>
using namespace std;

const int max_board=8;


class queens
 {
    public:
        queens(int size);
        void print()const;
        bool is_solved()const;
        void remove(int col);
        bool unguarded(int col)const;
        void insert(int col);
        int board_size;
     private:
         int count;
         bool queen_square[max_board][max_board];
            
 };
 
 queens::queens(int size)
   {
      count=0;
      board_size=size;
      for ( int row=0;row<board_size; row++) 
          for( int col=0; col<board_size;col++)
            {
               queen_square[row][col]=false;    
            } 
   }
   
   
 void queens::print() const
   {
      for (int row=0;row<board_size; row++)
        for( int col=0; col<board_size;col++)
          {
             if( queen_square[row][col]==true)
                cout<<"[row][col]"<<" "<<endl;
          }      
   }
   
 bool queens::is_solved() const
   {
      bool bval=false;
      if ( count==board_size)
        bval=true;
      return bval;
            
   }   
   
 void queens::remove(int col)
    {
       count=count-1;
       queen_square[count][col]=false;   
    }
    
 void queens::insert(int col)
   {
      queen_square[count++][col]=true;    
   }             
     
 bool queens::unguarded(int col)const
    {
       bool bval=false;
       int i;
       
       for ( i=0;bval && i<count;i++)
           bval=!queen_square[i][col];
       for ( i=0;bval && count-i>0 && col-i>0; i++)
           bval=! queen_square[count-i][col-i];
       for ( i=0; bval && count-i>0 && col+i<board_size;i++)
           bval=!queen_square[count-i][col+i];
           
       return bval;                         
    }     

#include"queen.h"

void solve_from(queens &configuration)
  {
     if ( configuration.is_solved()==true)
        configuration.print();
     else
        {
           for ( int col=0;col<configuration.board_size;col++)
             {
                if (configuration.unguarded(col))
                 {
                    configuration.insert(col);
                    solve_from(configuration);
                    configuration.remove(col);
                 }   
             }    
        }       
  }
  
  
  
  int main()
   {
      int board_size;
      cout<<"Please enter the size of the queen:"<<flush;
      cin>>board_size;
      if ( board_size < 0 || board_size > max_board )
        cout<<"The number is out of the range!"<<endl;
      else
        {
           queens configuration ( board_size );
           solve_from ( configuration );    
        } 
        system("pause");     
   }

14 个解决方案

#1


只見面向對象的語法
沒看出面向對象的思想

#2


我只發現了一個問題:
 在bool queens::is_solved() const里
 有這樣一句:if ( count==board_size) {...
 我的理解:
    A:count被你用為array index,當array size==8時,index最大為7(8-1),
      在你的程序的上下文中,count值最大==7;
    B:board_size被你用為array size,他始終比count大;
    綜上,count==board_size 恆為false;
    print不會被執行.

    

#3


bool queens::is_solved() const

   {

      bool bval=false;

      if ( count==board_size-1)

        bval=true;
還是打印不出來,

      return bval;

            

   }   

#4


天那,用c 也就一半長。

#5


錯誤確實在上樓的函數,print函數一直沒有執行

#6


bool queens::unguarded(int col)
    {
       bool bval=false;

       int i;
       
       for ( i=0; bval && i<count;i++)
           bval=!queen_square[i][col];
       for ( i=0;bval && count-i>0 && col-i>0; i++)
           bval=! queen_square[count-i][col-i];
       for ( i=0; bval && count-i>0 && col+i<board_size;i++)
           bval=!queen_square[count-i][col+i];
           
       return bval;                         
    }

#7


你覺得上面這個函數會執行嗎??
bool bval=false;

#8


回復人: pcboyxhy(-273.15℃) ( ) 信譽:110  2005-07-25 21:16:00  得分: 0  
 
 
   只見面向對象的語法
沒看出面向對象的思想
  
 
能不能說的稍微具體一點,學習中!

#9


又發現了:
A: 在void queens::print() const中:
   按照你的意思 用偽碼表述如下:
       if(當前位置==可以放置) out<<"空格"
   所以應該輸出了一堆空格,
   我的意思:
       if(當前位置==可以放置(即true)) out<<"空格"
       else out<<"*"        //(new)輸出一個被放置的標志

B: 如durkingzhang(永勝)所講:
   bool queens::unguarded(int col)這個東西看起來是判定當前位置是否可放;
   bval&& 這個東西多余.
C: 你漏了一個method:
   在你去掉了一個當前位置的皇后 之后:你應當把這個皇后的防衛也去掉.
D: 你又漏了一個method:
   在你安置了一個皇后 之后:你應當為這個皇后設置防衛,即:
     把 通過該皇后的 橫、縱、對角線 三個方向上的cell設為false(即不可放)
   

#10


謝謝謝謝,感激不盡

#11


醬紫應該比較簡單哦....

#include <stdio.h>
int s[50];
#define SS(o) (s[i]) o (s[8+j]) o (s[16+i+j]) o (s[40+i-j]) 
int main( int i , int j )
{
if( i > 8 ) for( i = 1; i <= 8; ++i ) printf( "%-10d" , s[i] ); 
else for( j = 1; j <= 8 ; ++j ) if( !( SS( | ) ) ) SS( = ) = j , main( i + 1 , 1 ) , SS(=) = 0;
}


#12


#include <stdio.h>
#define q(o) a[j]o[j+i+7]o[j-i+31]

int a[39];
void main(int i, int j)
{
bool fk=false;
static num=0;
for(j=9;--j;i>8?fk=true,printf("%2d ",a[j]):q(|a)||(q(=a)=i,main(i+1,j),q(=a)=0))
;
if(fk)
printf("\t%d\n", ++num);
}

這個也不麻煩

#13


up

#14


大家快發表意見,自己頂一下

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com