24h購物| | PChome| 登入
2009-05-24 07:51:33| 人氣416| 回應0 | 上一篇 | 下一篇

ACM 639 Don’t Get Rooked

推薦 0 收藏 0 轉貼0 訂閱站台

作法:DFS
想法:一直去搜尋可以擺放的位子

/********************************************************/

#include<stdio.h>     
#include<stdlib.h>
int map[5][5]={0},max;
int n;
int check(int a,int b)
{
  int a1,find=0;
  for(a1=a;a1<n;a1++)
   {
    if(map[a1][b]==1) {find=1;break;}
    if(map[a1][b]==-1) break;
   }
   for(a1=a;a1>=0;a1--)
   {
    if(map[a1][b]==1) {find=1;break;}
    if(map[a1][b]==-1) break;
   }
   for(a1=a;a1<n;a1++)
   {
    if(map[a][a1]==1) {find=1;break;}
    if(map[a][a1]==-1) break;
   }
   for(a1=a;a1>=0;a1--)
   {
    if(map[a][a1]==1) {find=1;break;}
    if(map[a][a1]==-1) break;
   }
  if(find==0) return 0;
  else return 1;
}
void DFS(int many) 
{
  if(max<many) max=many;
  int a,b;
  for(a=0;a<n;a++)
   for(b=0;b<n;b++)
     if(check(a,b)==0&&map[a][b]==0)
      {
       map[a][b]=1;
       DFS(many+1);
       map[a][b]=0;
      }
}
main()     
{     
 char x[6]={0};
 while(scanf("%d",&n)==1&&n!=0)
  {
   int a,b;
   for(a=0;a<5;a++)
    for(b=0;b<5;b++) map[a][b]=0;
   for(a=0;a<n;a++)
    {
      scanf("%s",x);
      for(b=0;b<n;b++)
       if(x[b]=='X') map[a][b]=-1;/*-1代表牆壁*/
    }
    max=0;
    DFS(0);
    printf("%d\n",max);
  }
 return 0;     
}

台長: 來源不明
人氣(416) | 回應(0)| 推薦 (0)| 收藏 (0)| 轉寄
全站分類: 數位資訊(科技、網路、通訊、家電) | 個人分類: ACM |
此分類下一篇:ACM 386 386 - Perfect Cubes
此分類上一篇:ACM 11586 11586 - Train Tracks

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文