杭电1045

来源:互联网 发布:软件业务需求分析 编辑:程序博客网 时间:2024/06/06 04:26

上链接:杭电1045


题目大意:

      黑点为一个炮台,可以往四个方向射击,墙会挡住子弹,求输入的地图中能存在的炮台最大数


贴代码:

#include<cstdio>using namespace std;int n;char map[5][5];bool judge(int t[][5]){for(int i=1; i<=n; ++i)for(int j=1; j<=n; ++j)if(t[i][j]==0)return false;return true;}int dfs(int t[][5]){int i, j, l, c, maximum=0;if(judge(t))return 0;for(i=1; i<=n; ++i)for(j=1; j<=n; ++j){if(t[i][j])continue;int tt[5][5];for(l=1; l<=n; ++l)for(c=1; c<=n; ++c)tt[l][c]=t[l][c];tt[i][j]=2;for(l=i,c=j; t[l][c]!=1&&c<=n; ++c)tt[l][c]=2;for(l=i,c=j; t[l][c]!=1&&c>=1; --c)tt[l][c]=2;for(l=i,c=j; t[l][c]!=1&&l<=n; ++l)tt[l][c]=2;for(l=i,c=j; t[l][c]!=1&&l>=1; --l)tt[l][c]=2;int x=1+dfs(tt);if(x>maximum)maximum=x;}return maximum;}int main(){int i,j;while(scanf("%d", &n)!=EOF && n){getchar();for(i=1; i<=n; ++i){for(j=1; j<=n; ++j)scanf("%c", &map[i][j]);getchar();}int t[5][5];for(i=1; i<=n; ++i)for(j=1; j<=n; ++j)t[i][j]=map[i][j]=='.'?0:1;printf("%d\n", dfs(t));}return 0;}

0 0