根据给定的信息,本文将对“缙云烧饼 poj openjudge Java”这一题目进行详细的解析,包括题目背景、代码逻辑解读、算法思路分析等方面。 ### 题目背景 题目来源于POJ(Peking University Online Judge)平台上的一个经典算法问题——缙云烧饼。缙云烧饼是一个形象化的描述,实际上题目考察的是二维数组中的模式匹配问题。题目要求在一个给定的二维字符数组中寻找特定形状的图案,并统计符合该形状的数量。 ### 代码逻辑解读 #### 输入处理 代码首先通过`Scanner`类读取输入数据。这里需要读取两行数据:第一行为二维数组的行数`m`和列数`n`;第二行则是具体的二维数组数据。代码中采用了一种较为简洁的方法来填充二维数组:先读取一行字符串,然后逐字符填入数组中。 #### 模式匹配 接下来是核心部分——模式匹配。根据题目要求,我们需要在数组中找到形如烧饼的图案,即中间有一个较大的圆形区域,周围有边界。具体来说,图案满足以下条件: 1. 中心位置为`*`。 2. 四周有连续的三个`*`作为边界。 3. 边界内还有其他`*`,总数达到27个。 4. 最外围还有一层边界,确保图案的完整性。 5. 图案的外边缘不能与其它图案相连。 为了实现这一逻辑,代码采用了多重循环结构: 1. 外层循环遍历数组的所有元素。 2. 内层循环检查当前位置是否符合条件一,即是否有`*`作为中心。 3. 如果当前位置满足条件,继续检查其周围的元素是否满足其余条件。 4. 如果所有条件都满足,则计数器`t`加一,并将匹配到的图案从原数组中清除(实际操作中是将这些位置的值设为空字符串`""`),以便后续的匹配不会重复计算。 ### 算法思路分析 #### 数据结构选择 本题选择了二维字符数组来表示原始数据,这是因为字符数组可以方便地表示二维空间中的各种形状和结构。此外,通过使用`Scanner`类读取输入数据,可以有效地处理大规模的数据集。 #### 模式识别 在模式识别的过程中,关键在于如何准确地定义目标图案的特征。本题中,图案的特点是中心有一个大的圆形区域,周围有边界。因此,通过检查每个位置及其周边元素的状态,就可以判断当前位置是否符合图案的要求。 #### 优化策略 虽然本题代码能够正确解决问题,但在实际应用中可能还需要进一步优化。例如,在检查当前元素是否符合条件时,可以通过提前终止循环来减少不必要的计算,提高效率。此外,还可以考虑使用更高效的数据结构或算法来加速模式匹配的过程。 “缙云烧饼”这道题目不仅考察了基本的数据结构和算法知识,还涉及到了模式识别等高级技能。通过对代码的深入分析,我们可以更好地理解这类问题的解决方法,并为进一步的学习和研究奠定基础。
public class Main{
public static void main(String args[])
{
Scanner cin=new Scanner(System.in);
while(cin.hasNextInt()){
int i,j,k,p=0,q,t=0;
int m=cin.nextInt();
int n=cin.nextInt();
char a[][]=new char[m][n];
for(i=0;i<m;i++){
String b=cin.next();
for(j=0;j<n;j++)
a[i][j]=b.charAt(j);
}
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
p=0;
if(a[i][j]=='*'&&j+4<n&&j-1>=0&&i+5<m)
for(k=j+1;k<=j+3;k++)
if(a[i][k]=='*')p++;
if(p==3){
for(q=i+1;q<i+5;q++)
for(k=j-1;k<=j+4;k++)
if(a[q][k]=='*')p++;
}
if(p==27){
for(k=j;k<j+4;k++)
if(a[i+5][k]=='*')p++;
- 粉丝: 0
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助