hdu 1045

来源:互联网 发布:js 对象转换为url参数 编辑:程序博客网 时间:2024/06/04 17:49

题目大意:

要求:碉堡不能在同一行、同一列。如果(X表示墙)X在这一行里 ,碉堡可以打不穿墙,也就是有墙可以放多个碉堡。

求一个n*n区域里最大可以放多少个碉堡。

基本上就是八皇后问题的改编,只不过如果遇到X就可以在次匹配而已。

这道题我还是用回溯法+剪枝。

#include<stdio.h>#include<string.h>char map[10][10];int visit[10][10];int n,ss,ans,t;int judge(int x,int y){int k;if(x<0||x>=n||y<0||y>=n)return 0;if(map[x][y]=='X'||visit[x][y]==1)return 0;    for(k=x-1;k>=0;k--){if(map[k][y]=='X')break;if(visit[k][y]==1)return 0;}for(k=y-1;k>=0;k--){if(map[x][k]=='X')break;if(visit[x][k]==1)return 0;}return 1;}void dfs(int ss){int x,y;if(ss==n*n){       if(ans<t)         ans=t; return;}    x=ss/n;y=ss%n;if(judge(x,y)){t++;visit[x][y]=1;dfs(ss+1);t--;        visit[x][y]=0;dfs(ss+1);}elsedfs(ss+1);}int main(){int i;while(scanf("%d",&n),n){t=0;      for(i=0;i<n;i++)  {  scanf("%s",map[i]);  }  memset(visit,0,sizeof(visit));  ans=0;  dfs(0);  printf("%d\n",ans);}return 0;}


 

0 0
原创粉丝点击