求PASCAL八皇后宽搜程序

求PASCAL八皇后宽搜程序,第1张

var

a:array[1..10] of integer

b:array[1..10] of boolean

c:array[1..20] of boolean

d:array[-9..9] of boolean

n:integer

procedure print

var i:integer

begin

for i:=1 to n do write(a[i],' ')

writeln

end

procedure try(t:integer)

var j:integer

begin

if t>n then

begin

print

exit

end

for j:=1 to n do

if b[j] and c[t+j] and d[t-j] then

begin

a[t]:=j

b[j]:=false

c[t+j]:=false

d[t-j]:=false

try(t+1)

b[j]:=true

c[t+j]:=true

d[t-j]:=true

end

End

begin

assign(input,'queen.in')

assign(output,'queen.out'携腊)

reset(input)

rewrite(output)

readln(n)

fillchar(b,sizeof(b),true)

fillchar(c,sizeof(c),true)

fillchar(d,sizeof(d),true)

try(1)

close(input)

close(output)

end.

这个源纳程序是N皇后问题的程辩裂滑序,也包括8皇后

// 8皇后.cpp : Defines the entry point for the console application.

//

//问题描述:在一个8×8国际象棋盘上,有8个皇后,每个皇后占一格;

//要求皇后间不会出现相互攻击的现象,即不能有两个皇后处宴帆咐在同一行、同一列或同一对角线上

//问共有多少种不同的晌纯摆放方法?

// 本解法采用回溯递归法,容易理解,

// 首先在棋盘上摆第一个皇后,然后摆第二个,每摆一个皇后则判断位置是否合法。

// 如果合法,则摆下一个皇后,如果不合法则在本行下一个位置尝试,所有位置尝试失败

// 则拿掉这个皇后,重新摆放上一个皇后的位置.

// 也就是说如果第n个皇后摆放失败 一直向上回溯 重新摆放第n-1皇后位置.

// 全局变量chess_board[]代表棋盘,每一行放一个皇后.

// 显然chess_board[4]==5 则说明第4个皇后放在第4行第5个位置

// 同理chess_board[1]==3 则说明第1个皇后放在第1行第3个位置

// 全局变量counter做计数器

/轿码/ AtLight 2007-09-29

#include <iostream>

#define MAX 8

int chess_board[MAX+1]

int counter

bool trial(int n)

{

//本函数用于判定棋盘第N行的皇后位置是否合法

//并打印出合法的方案

//为容易理解,本函数没有优化

int left_diagonal = chess_board[n] - 1

int right_diagonal= chess_board[n] + 1

for(int prior=n-1prior>=1prior--)

{

if(chess_board[prior] == chess_board[n]) return false

//是否有同列的棋子

if(chess_board[prior] == left_diagonal) return false

//左斜线是否有棋子

if(chess_board[prior] == right_diagonal) return false

//右斜线是否有棋子

left_diagonal --

right_diagonal ++

}

//如果是最后一个棋子,并且摆放合法,则打印结果.

if(n==MAX)

{

counter++

std::cout<<"方法"<<counter<<":"<<"\t"

for(int i=1i<=MAXi++) std::cout<<chess_board[i]<<" "

std::cout<<std::endl

}

//摆放位置合法,返回true

return true

}

void search_position(int n)

{

//本函数用于遍历棋盘第N行的皇后位置所有位置

//每次都调用trial()来判定当前位置是否合法

for(int position=1position<=MAXposition++)

{

chess_board[n] = position

if(trial(n) &&n<MAX) search_position(n+1)

//如果摆放位置合法,又不是最后一行,

//则寻找下一行皇后的摆放位置

}

}

int main(void)

{

search_position(1)

system("PAUSE")

return 0

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12293915.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存