SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 2590|回复: 3
打印 上一主题 下一主题

SAS解决八皇后问题

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2011-7-23 13:09:52 | 只看该作者

SAS解决八皇后问题

在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
[code:24ah0g9z]%Macro FirstOf(List);%Scan(&List,1)%Mend;
%Macro RestOf(List);%Local lth;%Let lth=%Length(%FirstOf(&List));%If %Length(&List)>&lth %Then %Left(%Substr(&List,%Eval(1+&lth)));%Mend;

%Macro OkToAdd(Element,At=,To=,StartAt=);
    %If &To eq %str() or &Element eq %str() %Then 1;
    %Else %If %Sysfunc(Abs(%Eval(%FirstOf(&To)-&Element)))=%Sysfunc(Abs(%Eval(&At-&StartAt))) %Then %Do; 0 %Return;%End;
    %Else %OkToAdd(&Element,At=&At,To=%RestOf(&To),StartAt=%eval(1+&StartAt));
%Mend;

%Macro qIter(PartialSolution=,List=,Level=,CounterName=);
    %Local item preFix sufFix;
    %If &List eq %str() %Then %Do;%Let &CounterName=%eval(1+&&&CounterName);%Put &&&CounterName [&PartialSolution];%End;
    %Else %Do;
        %let preFix=;%let item=%FirstOf(&List);%let sufFix=%RestOf(&List);
        %Do %Until (&preFix eq &List);   
            %If %OkToAdd(&item,At=&Level,To=&PartialSolution,StartAt=1) %Then %qIter(PartialSolution=&PartialSolution &item, List=&preFix &sufFix, Level=%eval(&Level+1),CounterName=&CounterName);
            %let preFix=&preFix &item;%let item=%FirstOf(&sufFix);%let sufFix=%RestOf(&sufFix);
        %End;
    %End;
%Mend;


%let c=0;
%qIter(PartialSolution=,List=1 2 3 4 5 6 7 8,Level=1,CounterName=c)[/code:24ah0g9z]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2011-7-26 18:28:56 | 只看该作者

Re: SAS解决八皇后问题

我以前写的解法。哈哈
[code:248c7omk]%macro test(level);
      do i=1 to &level-1  ;/*test eligibility*/
      if x(&level)=x(i) then do;failed=1;leave;end;
      if x(&level)-x(i)=&level-i then do;failed=1;leave;end;
      if x(i)-x(&level)=&level-i then do;failed=1;leave;end;
      end;
      if failed then do;failed=0;continue;end;
%mend;

%macro inner(level);
  do x&level=1 to 8;
      %test(&level)
%mend;

data queen ;
  array x(1:8) x1-x8;
  failed=0;
  do x1=1 to 8;
    %inner(2);
      %inner(3);
        %inner(4);
          %inner(5);
            %inner(6);
              %inner(7);
                %inner(8);
                output;
                end;
              end;
            end;
          end;
        end;
      end;
    end;
  end;
run;[/code:248c7omk]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2011-7-26 23:15:27 | 只看该作者

Re: SAS解决八皇后问题

学习了...嘿嘿!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2011-8-4 10:00:34 | 只看该作者

Re: SAS解决八皇后问题

太牛了,看得我头昏眼花。
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2025-6-9 22:00 , Processed in 0.067790 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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