SCU training contest 2 B、Fire Net

1、题目比较新鲜的地方就是有个墙,其实和八皇后没啥区别。用回溯法,要分放与不放两种情况讨论。

#include<cstdio>
using namespace std;
int n,ans,max;
char s[6][6];
bool is_valid(int x,int y){
     bool flag=true;
  if(s[x][y]=='X') flag=false;
  else{
        for(int i=n-1;i>=0;i--){
     if(s[x][i]=='o'){flag=false;break;}
        if(s[x][i]=='X') break;
  }
     for(int i=n-1;i>=0;i--){
        if(s[i][y]=='o'){flag=false;break;}
      if(s[i][y]=='X') break;
     }
 }
 if(flag) return true;
 else return false;
}
void dfs(int x,int y){
    if(x==n&&y==n){
    bool flag=false;
    if(is_valid(x,y)){
        ans++;
     flag=true;
    }
    if(ans>max) max=ans;
    if(flag) ans--;
    return;
 }else{
    if(is_valid(x,y)){
        s[x][y]='o';
     ans++;
     if(y+1<=n)
       dfs(x,y+1);
     else
    dfs(x+1,1);
     ans--;
     s[x][y]='.';
    }
    if(y+1<=n)
      dfs(x,y+1);
    else
   dfs(x+1,1);
 }
 return;
}
int main(){
 //freopen("a.txt","r",stdin);
    while(scanf("%d",&n)==1&&n){
  ans=0;max=0;
     for(int i=1;i<=n;i++){
   scanf("%s",s[i]+1);
   s[i][0]='X';
  }
  for(int j=0;j<=n;j++)
   s[0][j]='X';
        dfs(1,1);
  printf("%d\n",max);
 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值