八皇后问题(递归)

 

 

#include <iostream>
#include 
<cstdio>
#include 
<sys/timeb.h>
using namespace  std;

const int MAX_SIZE = 100
;
enum flag {blank ='X',queen = 1}
;

char Chess[MAX_SIZE][MAX_SIZE];//棋盘图

int n;//解决n皇后问题
int total;//用于计摆放方式


void  Init()
{//对棋牌进行初始化
    for(int i = 0; i < n; i++)
        
for(int j = 0; j < n; j++
)
            Chess[i][j] 
=
 blank;
    total 
= 0;//初始时有零中摆放方式

}


bool Judge(int r,int  c)
{//判断(r,c)位置是否可放置
    int i,j;
    
for(i = r + 1; i < n; i++
)
        
if(Chess[i][c] ==
 queen)
            
return false;//说明c列上已有一皇后

    for(i = c + 1; i < n; i++)
        
if(Chess[r][i] ==
 queen)
            
return false;//说明r行上已有一皇后

    for(i = r + 1, j = c + 1; (i < n) && (j < n); i++, j++)
        
if(Chess[i][j] ==
 queen)
            
return false;//45度斜线上已有一皇后

    for(i = r + 1, j = c - 1; (i <n) && (j >= 0); i++, j--)
        
if(Chess[i][j] ==
 queen)
            
return false;//135度斜线上已有一皇后

    return true;//排除四种情况后,说明(r,c)点可放置皇后
}


void Backtrack(int k,int  cnt)
{//回溯算法主程序
    
    
if(k < 0 || cnt == n)//棋牌摆放完毕 or 以摆满n后

    {
        
if(cnt ==
 n)
        
{
            printf(
"No.%d:\n",++
total);
            
for(int i = 0; i < n; i++
)
            
{
                
for(int j = 0; j < n; j++
)
                    printf(
" %c "
,Chess[i][j]);
                putchar(
'\n'
);
            }
                     
            putchar(
'\n'
);
        }

    }

    
else
    
{
        
int r = k / n, c = k %
 n;
        
if
(Judge(r,c))
        
{//可放置一皇后
            Chess[r][c] = queen;
            Backtrack(k
-1,cnt+1
);
            Chess[r][c] 
=
 blank;
        }

        Backtrack(k
-1,cnt);
    }

    
}


int  main()
{//此为主函数
    timeb t1,t2;
    
long
 kk;
    cout
<<"输入皇后个数:"
;
    
while(cin>>
n)
    
{
            Init();
            ftime(
&
t1);
            Backtrack(n
*n-1,0
);
            ftime(
&
t2);
            cout
<<"计算"<<n<<"后问题总共可有"<<total<<"种摆法!"<<
endl;
            kk 
= (t2.time-t1.time)*1000 + t2.millitm-
t1.millitm;
            cout
<<"本次回溯耗时:"<<kk<<"毫秒"<<
endl;
            system(
"PAUSE"
);
            cout
<<"输入皇后个数:"
;
    }

    
return 0;
}

 

 

你可能感兴趣的:(八皇后)