2018年 第九届蓝桥杯 Java B组 方格计数

博客围绕二维平面上以小方格顶点为圆心、半径为1000的圆展开,提出计算圆内完整小方格数量的问题。给出的解法是以圆心为坐标原点划分四个象限,通过计算一个象限内方块个数再乘以4得出结果,最终答案是3137548。

2.方格计数

如图p1.png所示,在二维平面上有无数个1x1的小方格。

我们以某个小方格的一个顶点为圆心画一个半径为1000的圆。
你能计算出这个圆里有多少个完整的小方格吗? 

注意:需要提交的是一个整数,不要填写任何多余内容。

【答案】:以圆的圆心为坐标原点,半径所在直线为横轴和纵轴,将圆划分为四个象限。计算出一个象限内的方块个数再*4即可。

设a,b为最远的方块的长度,r为圆的半径长。最远的方块的的顶点一定不会超过圆的半径因此a*a+b*b<=r*r。

public class Main {
	public static void main(String args[]) {
		int a, b;
		int r = 1000;// 半径长度
		int sum = 0;// 总个数
		for (int i = 0; i < 1000; i++) {
			for (int j = 0; j < 1000; j++) {
				a = i + 1;
				b = j + 1;
				if (a * a + b * b <= r * r)
					sum++;
			}
		}
		System.out.println(sum * 4);
	}
}

答案:3137548

### 关于第七届蓝桥杯 C++ B 方格填数问题 此问题属于典型的回溯算法应用,目标是在给定的方格中填充数字,满足特定条件。以下是对此类问题的一般解法和思路。 #### 1. **问题背景** 该问题是要在一个二维网格上放置若干个不同的数字,使得每一行、每一列以及某些特殊区域内的数字均不重复。这类问题通常可以通过暴力枚举或者优化后的回溯方法解决[^2]。 #### 2. **核心解题思路** 通过递归实现回溯算法来遍历所有可能的情况,并剪枝减少不必要的计算量。具体步骤如下: - 定义一个函数用于尝试在当前状态下继续填充下一个位置。 - 如果当前位置无法合法填充,则返回至上一层重新选择其他可能性。 - 当成功完成整个棋盘填充时记录结果并退出或继续寻找更多方案。 #### 3. **伪代码表示** ```cpp bool isValid(int row, int col, vector<vector<int>>& grid) { // 检查行列是否有相同元素 for (int i = 0; i < N; ++i) { if (grid[row][i] == grid[row][col]) return false; if (grid[i][col] == grid[row][col]) return false; } // 特殊区域检查逻辑... return true; } void solve(vector<vector<int>>& grid, int pos) { if (pos >= total_positions) { outputSolution(grid); return; } for (auto num : available_numbers) { grid[pos / cols][pos % cols] = num; if (!isValid(pos / cols, pos % cols, grid)) continue; solve(grid, pos + 1); grid[pos / cols][pos % cols] = EMPTY; // 回退操作 } } ``` 上述代码片段展示了如何利用递归来探索每一种状态合的可能性,并且包含了基本的合法性验证部分[^1]。 #### 4. **注意事项** - 初始设置应考虑边界情况及输入数据的有效性检验。 - 对于较大的规模实例,需注意时间复杂度控制,在实际编码过程中加入尽可能多有效的提前终止条件以提高效率。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值