2011年12月31日 星期六

acm 750 8 Queens Chess Problem

[心得] //0.004

在西洋棋得棋盤中你可以放置8個皇后而且彼此都不衝突(就是都不能吃到對方)。給你某一個皇后的位置,請你寫一個程式來輸出所有這樣可能的安排。


#include <stdio.h>

#define MAXSIZE 8
int map[MAXSIZE+1],left[2*MAXSIZE+1],right[2*MAXSIZE+1],answer[MAXSIZE+1];
int a,b;
int counter;


void queen(int x)
{
    int i; 

    if(x == b)
        ++x;
    if(x==9)
    { 
        printf( "%2d     ", ++counter );    
        for ( i = 1; i <= MAXSIZE; i++ )
        { 
            printf( " %d", answer[ i ] );

        }
        printf("\n");
        return;  
    }

       for(i = 1; i <= MAXSIZE;i++)
       {
             int L = i-x+MAXSIZE;
             int R = i+x;
             if(!left[L]&&!right[R]&& !map[i])
             {
               left[L] = right[R]=map[i]=1;
               answer[x]=i;
               queen(x+1);
               left[L] = right[R]=map[i]=0;                
             }
       }  
   
}
int main()
{
  int data;
  scanf("%d",&data);
  while(data--)
  {
    scanf("%d %d",&a,&b);  

    memset(map,  0, sizeof(int)*(MAXSIZE+1));
    memset(left, 0, sizeof(int)*(2*MAXSIZE+1));
    memset(right,0, sizeof(int)*(2*MAXSIZE+1));
       
    left[a-b+MAXSIZE]=1;
    right[a+b]=1;
    map[a]=1;
    answer[b]=a;
    counter = 0;
    printf( "SOLN       COLUMN\n #      1 2 3 4 5 6 7 8\n\n" );  
    queen(1);  
    if(data )
       printf("\n");   
  } 
   
  //return 0;
  system("pause");
}

沒有留言:

張貼留言