SAS中文论坛

标题: SAS解决八皇后问题 [打印本页]

作者: shiyiming    时间: 2011-7-23 13:09
标题: 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]
作者: shiyiming    时间: 2011-7-26 18:28
标题: 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]
作者: shiyiming    时间: 2011-7-26 23:15
标题: Re: SAS解决八皇后问题
学习了...嘿嘿!
作者: shiyiming    时间: 2011-8-4 10:00
标题: Re: SAS解决八皇后问题
太牛了,看得我头昏眼花。




欢迎光临 SAS中文论坛 (http://mysas.net/forum/) Powered by Discuz! X3.2