HDU2553 (N皇后)

题意:N皇后

方法:BFS+打表

View Code
 1 #include<stdio.h>

 2 #include<string.h>

 3 const int maxn = 21;

 4 int sd[ maxn*2 ],c[ maxn ],md[ maxn*2 ];

 5 struct node{

 6     int r,c,flag;

 7 }p,stack[ maxn*maxn ];

 8 int ans,n;

 9 

10 void bfs(){

11     int top=-1;

12     for( int i=n-1;i>=0;i-- ){

13         stack[ ++top ].r=0;

14         stack[ top ].c=i;

15         stack[ top ].flag=0;//0 stand for not the path

16     }

17     memset( sd,0,sizeof(sd));

18     memset( c,0,sizeof(c));

19     memset( md,0,sizeof(md));

20     while(  top>=0 ){

21         node now;

22         now=stack[ top ];

23         if( now.flag==0 ){

24             if( sd[ now.r+now.c ]==1 || c[ now.c ]==1 || md[ now.r-now.c+n-1 ]==1 ) top--;

25             else {

26                 sd[ now.r+now.c ]=c[ now.c ]=md[ now.r-now.c+n-1 ]=1;

27                 stack[ top ].flag=1;//标记待会要出栈

28                 if( now.r==n-1 ) ans++;

29                 else{

30                     for( int i=n-1;i>=0;i--){

31                          stack[++top].r=now.r+1;

32                          stack[top].c=i;

33                          stack[top].flag=0;

34                     }//put the next line into the stack

35                 }

36             }

37         }

38         else{

39             sd[ now.r+now.c ]=c[ now.c ]=md[ now.r-now.c+n-1 ]=0;

40             top--;

41         }

42     }

43     return ;

44 }

45 

46 int main(){

47     while( scanf("%d",&n) && n ){

48         ans=0;

49         bfs();

50         printf("%d\n",ans);

51     }

52     return 0;

53 }

 

你可能感兴趣的:(HDU)