找回密码
 注册
Simdroid-非首页
查看: 67|回复: 0

Matlab 递归求解八皇后问题

[复制链接]
发表于 2013-3-17 18:23:23 | 显示全部楼层 |阅读模式 来自 河北廊坊
以前写过一个枚举法求解八皇后问题的程序,今天再写一个递归求解的程序
  1. function Queens
  2. % 8皇后问题的递归法求解
  3. sol = 1; % 解的个数
  4. queen = zeros(8); % 8*8的棋盘
  5. saferows = true(1,8); % 用来表示每一行是否是安全位置
  6. safeleftdiag = true(1,15); % 用来表示左对角是否安全,在同一个左对角上的元素满足i1+j1 = i2 + j2;
  7. saferightdiag = true(1,15);% 用来表示左对角是否安全,在同一个右对角上的元素满足i1-j1 = i2 - j2;
  8. trycol(1); % 检查第一列是否可以放置皇后
  9. % 该函数用来检查第col列是否可以方位皇后
  10.     function trycol(col)
  11.         % 对行循环,一行一行的去放
  12.         for row = 1 : 8
  13.             % 检查第row行第col列的位置是否安全
  14.             if safe(row,col)
  15.                 % 如果安全,该位置被占据,该行和对角不安全
  16.                 [saferows(row),safeleftdiag(row + col - 1),saferightdiag(row - col + 8)]=deal(false);
  17.                 queen(row,col) = 1;
  18.                 % 如果是第8列,说明解完成,输出
  19.                 if col == 8
  20.                     fprintf('第%d个解\n',sol);
  21.                     disp(queen);
  22.                     sol = sol + 1;
  23.                 else % 否则,去试探下一列
  24.                     trycol(col + 1);
  25.                 end
  26.                 % 判断完该行,就去判断下一行,应该清除该行的占据信息和安全信息
  27.                 [saferows(row),safeleftdiag(row + col - 1),saferightdiag(row - col + 8)]=deal(true);
  28.                 queen(row,col) = 0;
  29.             end
  30.             
  31.         end
  32.     end
  33. % 该函数用来检查第row行第col列的位置是否安全
  34.     function y = safe(row,col)
  35.         % 检查该列的行,左对角,右对角是否安全
  36.         y = saferows(row) & safeleftdiag(row + col - 1) & saferightdiag(row - col + 8);
  37.     end
  38. end
复制代码

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-7-1 09:40 , Processed in 0.025831 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表