分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 教程案例

zoj 1002 Fire Net 碉堡的最大数量【DFS】

发布时间:2023-09-06 01:47责任编辑:顾先生关键词:暂无标签

题目链接

题目大意:

假设我们有一个正方形的城市,并且街道是直的。城市的地图是n行n列,每一个单元代表一个街道或者一块墙。

碉堡是一个小城堡,有四个开放的射击口。四个方向是面向北、东、南和西。在每一个口子上有一架机关枪。

假设子弹能够穿过任何距离,并且摧毁路上的碉堡。另一方面,子弹不能穿越墙。

我们的目标是在城市里设置足够多的碉堡,并且任何两个碉堡都不会互相摧毁。正确的配置是没有两个碉堡在相同的水平行或者垂直列上,除非碉堡之间有墙把它们分开。在这个问题中,我们将使用小的方形城市(最多4*4),它包含了墙,并且子弹不能穿越。

接下来的图片显示五张城市地图,第1张图片是空的布局,第2张和第3张图片显示了合法的配置,第4和第5张图片显示了非法的配置。对于这样的地形来说,碉堡的最大数是5;第2张图片显示了这个配置方案,但还有其他的配置方案。

你的任务是写一个程序,在给出的地图描述下,计算城市中可以合法放置的碉堡的最大数。

输入文件包含一个或者多个地图描述,0作为文件的结束。每个地图描述首行是城市的尺寸n,n最大为4。接下来的n行描述了地图的每一行,符号“."代表开放区域,大写的X代表墙。输入文件中没有空格。

每一个测试用例,最后输出一行为合法放置碉堡的最大数。

Sample input:

4.X......XX......2XX.X3.X.X.X.X.3....XX.XX4................0

Sample output:

51524

#include <stdio.h>int n, res,max;int chess[10][10];int juge(int x, int y){ ???int i, j; ???for (i = y; i >= 0; i--) ???{ ???????if (chess[x][i] == 1)return 0; ???????if (chess[x][i] == 2)break; ???} ???for (i = y; i < n; i++) ???{ ???????if (chess[x][i] == 1)return 0; ???????if (chess[x][i] == 2)break; ???} ???for (i = x; i >= 0; i--) ???{ ???????if (chess[i][y] == 1)return 0; ???????if (chess[i][y] == 2)break; ???} ???for (i = x; i < n; i++) ???{ ???????if (chess[i][y] == 1)return 0; ???????if (chess[i][y] == 2)break; ???} ???return 1;}void dfs(){ ???int i, j; ???if (res > max)max = res; ???for (i = 0; i < n; i++) ???{ ???????for (j = 0; j < n; j++) ???????{ ???????????if (!chess[i][j] && juge(i, j)) ???????????{ ???????????????chess[i][j] = 1; ????????????//选择在该点放碉堡 ???????????????res++; ???????????????dfs(); ???????????????chess[i][j] = 0; ????????????//选择在该点不放碉堡 ??????????????这种感觉有点像动态规划的思想 ???????????????res--; ???????????} ???????} ???}}int main(){ ???char str[10]; ???int i, j; ???while (scanf("%d", &n) != EOF, n) ???{ ???????max = 0; ???????for (i = 0; i < n; i++) ???????{ ???????????scanf("%s", str); ???????????for (j = 0; j < n; j++) ???????????{ ???????????????if (str[j] == ‘X‘)chess[i][j] = 2; ???????????????else chess[i][j] = 0; ???????????} ???????} ???????res = 0; ???????dfs(); ???????printf("%d\n", max); ???} ???return 0;}


2018-03-31

zoj 1002 Fire Net 碉堡的最大数量【DFS】

原文地址:https://www.cnblogs.com/00isok/p/8681213.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved