八皇后夹墙版

  1. /* 
  2. 来自网络。很精典。dfs的精典利用。什么时候我也能想出这样的算法呀,努力!!!!! 
  3. */  
  4. #include <stdio.h>  
  5.   
  6. bool canput(char map[5][5], int y, int x){   //判断能不能放塔  
  7.   if(map[y][x] != '.')return 0;   //以经放塔或者为墙。不能放塔  
  8.   int i;  
  9.   for(i = y - 1; i >= 0; i--){  
  10.    if(map[i][x] == 'X')break;     //有一堵墙  
  11.    if(map[i][x] == 'F')return 0;  //以放塔  
  12.   }  
  13.   for(i = x - 1; i >= 0; i--){  
  14.    if(map[y][i] == 'X')break;  
  15.    if(map[y][i] == 'F')return 0;  
  16.   }  
  17.   return 1;  
  18. }  
  19.   
  20. void dfs(char map[5][5], int n, int depth, int put, int &max){  
  21.  if(put > max)max = put;  
  22.   
  23.  if(depth >= n*n)  //递归调了n*n次?  
  24.   return;  
  25.   
  26.  dfs(map,n,depth+1,put,max);   //这是最原始的地图,没有放任何塔  
  27.   
  28.  int y = depth / n, x = depth % n;  //得到将要判断的点的x,y坐标  
  29.   
  30.   if(canput(map,y,x)){  
  31.    map[y][x] = 'F';  
  32.    put++;  
  33.    dfs(map, n, depth+1, put, max);   //这是放了塔后的地图  
  34.    map[y][x] = '.';  
  35.    put--;  
  36.   }  
  37. }  
  38.   
  39.   
  40. int main(){  
  41.  //freopen("input.txt","r",stdin);  
  42.  char map[5][5];  
  43.  int i,n,firenet;  
  44.  while(scanf("%d",&n)!=EOF && n){  
  45.   firenet = 0;  
  46.   for(i = 0; i < n; i++)scanf("%s",&map[i]);  
  47.   dfs(map,n,0,0,firenet);  
  48.   printf("%d/n",firenet);  
  49.  }  
  50.  return 0;  
  51. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值