|
楼主

楼主 |
发表于 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] |
|