题目要求

P1101题目链接

分析

可以用DFS做,但我立下了个Flag,所以就用了朴素的枚举来做。。。。

结果,我的天哪,做了好几个小时……

其实这种地图题,真的适合 DFS or BFS or DP 这种,这种八向枚举,太难受了。
好处是可以不去分析递归问题或者动态转移方程。

我开两个数组,一个是char类型,一个是byte类型(其实是相当于boolean类型)。
题好像没给数值边界,所以我怕爆炸,使用BufferedReader而不是Scanner(其实这种也不是读数值,可能差不到太多)。

DFS等搜索算法写法的思路是从一个点开始逐步递归到边界,每次八向尝试。但朴素暴力算法则不同。

我们把问题全局看,不着眼于某个点及其下一步的分散走向,有四大类:

  1. 每一行
  2. 每一列
  3. 每一个长度大于7的“主对角线”
  4. 每一个长度大于7的“次对角线”

想要反向,其实可以换个思路,就是改为判断"yizhong"反过来的"gnohziy",这样就简化了问题,把把八种情况化作四种情况。

再就是,对角线要在两侧开,所以要细分情况。

这题其实我这么写很难写,需要考虑整个的边界值,自闭……

再就是一个核心算法了:数组中串的模式匹配。
先使用StringBuilder把数组元素遍历从而凑成串,然后使用indexOf()和replace(),在循环中进行多次匹配,因为可能有多次出现。(这种用法我在其他洛谷题题解博客中写到过,挺实用)

避坑指南

错了三次。

第一次是repeat()的问题,这个其实在代码注释中也说了,洛谷的Java8不支持repeat()但Idea疯狂暗示使用这个,没办法你只能改。

第二次是空格问题,我习惯性打印了空格,把每个元素分开,但这题没分隔符。

第三次就是发现了可能在一行、一列、一对角线中有多次重复串,需要多次匹配,就把代码几乎翻了一遍。
测试数据点3:
in

16
qyizhongqyizhong
gydthkjygydthkjy
nwidghjinwidghji
orbzsfgzorbzsfgz
hhgrhwthhhgrhwth
zzzzzozozzzzzozo
iwdfrgngiwdfrgng
yyyyggggyyyygggg
qyizhongqyizhong
gydthkjygydthkjy
nwidghjinwidghji
orbzsfgzorbzsfgz
hhgrhwthhhgrhwth
zzzzzozozzzzzozo
iwdfrgngiwdfrgng
yyyyggggyyyygggg

out

*yizhong*yizhong
gy******gy******
n*i*****n*i*****
o**z****o**z****
h***h***h***h***
z****o**z****o**
i*****n*i*****n*
y******gy******g
*yizhong*yizhong
gy******gy******
n*i*****n*i*****
o**z****o**z****
h***h***h***h***
z****o**z****o**
i*****n*i*****n*
y******gy******g

AC代码(Java语言描述)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class Main {public static void main(String[] args) throws IOException {BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));int num = Integer.parseInt(reader.readLine());char[][] chars = new char[num][num];byte[][] flags = new byte[num][num];//初始化for (int i = 0; i < num; i++) {char[] temp = reader.readLine().toCharArray();for (int j = 0; j < num; j++) {chars[i][j] = temp[j];}}reader.close();if (num < 7) {StringBuilder result = new StringBuilder();for (int i = 0; i < num; i++) {result.append('*');}//洛谷不识别下面的代码//String result = "*";//result = result.repeat(num);for (int i = 0; i < num; i++) {System.out.println(result);}return;}//水平方向for (int i = 0; i < num; i++) {StringBuilder temp = new StringBuilder(), temp2;for (int j = 0; j < num; j++) {temp.append(chars[i][j]);}temp2 = temp;int index = temp.indexOf("yizhong");while (index >= 0) {for (int j = index; j < index+7; j++) {if (flags[i][j] == 0) {flags[i][j] = 1;}}temp.replace(index, index+7, "zzzzzzz");index = temp.indexOf("yizhong");}index = temp2.indexOf("gnohziy");while (index >= 0) {for (int j = index; j < index+7; j++) {if (flags[i][j] == 0) {flags[i][j] = 1;}}temp.replace(index, index+7, "zzzzzzz");index = temp2.indexOf("gnohziy");}}//竖直方向for (int j = 0; j < num; j++) {StringBuilder temp = new StringBuilder(), temp2;for (int i = 0; i < num; i++) {temp.append(chars[i][j]);}temp2 = temp;int index = temp.indexOf("yizhong");while (index >= 0) {for (int i = index; i < index+7; i++) {if (flags[i][j] == 0) {flags[i][j] = 1;}}temp.replace(index, index+7, "zzzzzzz");index = temp.indexOf("yizhong");}index = temp2.indexOf("gnohziy");while (index >= 0) {for (int i = index; i < index+7; i++) {if (flags[i][j] == 0) {flags[i][j] = 1;}}temp.replace(index, index+7, "zzzzzzz");index = temp2.indexOf("gnohziy");}}//主对角线方向//下方扫描for (int i = 0; i < num-7; i++) {StringBuilder temp = new StringBuilder(), temp2;int x = i, y = 0;while (x < num) {temp.append(chars[x++][y++]);}temp2 = temp;int index = temp.indexOf("yizhong");while (index >= 0) {for (int j = i+index, k = index; k < index+7; j++, k++) {if (flags[j][k] == 0) {flags[j][k] = 1;}}temp.replace(index, index+7, "zzzzzzz");index = temp.indexOf("yizhong");}index = temp2.indexOf("gnohziy");while (index >= 0) {for (int j = i+index, k = index; k < index+7; j++, k++) {if (flags[j][k] == 0) {flags[j][k] = 1;}}temp.replace(index, index+7, "zzzzzzz");index = temp2.indexOf("gnohziy");}}//主对角线方向//右侧扫描for (int i = 0; i < num-7; i++) {StringBuilder temp = new StringBuilder(), temp2;int x = 0, y = i;while (y < num) {temp.append(chars[x++][y++]);}temp2 = temp;int index = temp.indexOf("yizhong");while (index >= 0) {for (int j = i+index, k = index; k < index+7; j++, k++) {if (flags[k][j] == 0) {flags[k][j] = 1;}}temp.replace(index, index+7, "zzzzzzz");index = temp.indexOf("yizhong");}index = temp2.indexOf("gnohziy");while (index >= 0) {for (int j = i+index, k = index; k < index+7; j++, k++) {if (flags[k][j] == 0) {flags[k][j] = 1;}}temp.replace(index, index+7, "zzzzzzz");index = temp2.indexOf("gnohziy");}}//次对角线方向//下方扫描for (int i = 0; i < num-6; i++) {StringBuilder temp = new StringBuilder(), temp2;int x = i, y = num-1;while (x < num) {temp.append(chars[x++][y--]);}temp2 = temp;int index = temp.indexOf("yizhong");while (index >= 0) {for (int j = i+index, k = num-index-1; j < i+index+7; j++, k--) {if (flags[j][k] == 0) {flags[j][k] = 1;}}temp.replace(index, index+7, "zzzzzzz");index = temp.indexOf("yizhong");}index = temp2.indexOf("gnohziy");while (index >= 0) {for (int j = i+index, k = num-index-1; j < i+index+7; j++, k--) {if (flags[j][k] == 0) {flags[j][k] = 1;}}temp.replace(index, index+7, "zzzzzzz");index = temp2.indexOf("gnohziy");}}//次对角线方向//左侧扫描for (int i = num-1; i > 5; i--) {StringBuilder temp = new StringBuilder(), temp2;int x = 0, y = i;while (y > 0) {temp.append(chars[x++][y--]);}temp2 = temp;int index = temp.indexOf("yizhong");while (index >= 0) {for (int j = index, k = i-index; j < index+7; j++, k--) {if (flags[j][k] == 0) {flags[j][k] = 1;}}temp.replace(index, index+7, "zzzzzzz");index = temp.indexOf("yizhong");}index = temp2.indexOf("gnohziy");while (index >= 0) {for (int j = index, k = i-index; j < index+7; j++, k--) {if (flags[j][k] == 0) {flags[j][k] = 1;}}temp.replace(index, index+7, "zzzzzzz");index = temp2.indexOf("gnohziy");}}//打印结果for (int i = 0; i < num; i++) {StringBuilder result = new StringBuilder();int j;for (j = 0; j < num; j++) {if (flags[i][j] == 0) {result.append('*');} else {result.append(chars[i][j]);}}System.out.println(result);}}
}

枚举求解单词方阵(洛谷P1101题题解,Java语言描述)相关推荐

  1. 深度优先搜索——单词方阵(洛谷 P1101)

    题目选自洛谷P1101 这道题也是挺不错的DFS的题,但是区别于一般的深搜, 这道题在选定一个方向后,就不能改变了! 给出我的详细思路就是: 用char a[101][101]保存输入的数据,int ...

  2. 动态规划求解装箱问题(洛谷P1049题题解,Java语言描述)

    题目要求 P1049题目链接 分析 这种题不能贪心,大家都懂的,应该使用DP. 比如容量为7,有三个物品体积是1,2,5,你要是先装小的,就只能装3,剩下4,但实际上可以装的只剩一个. 如果容量为10 ...

  3. 队列模拟约瑟夫问题(洛谷P1996题题解,Java语言描述)

    题目要求 P1996题目链接 分析 以前就研究过"约瑟夫环"问题: <单循环链表求解约瑟夫环问题(Java语言描述)> <杀人游戏~约瑟夫环(洛谷P1145题题解 ...

  4. 线性存储的最短平均检索时间(洛谷P1253题题解,Java语言描述)

    题目要求 P1253题目链接 分析 很像 ~洛谷P1223题题解~,也是一种类似SJF的贪心法. 排个序,由于两个不大于10000的数,乘起来还是int,就使用int属性吧. 数据量小,所以Scann ...

  5. 暴力枚举也不能没有底线(洛谷P1003题题解,Java语言描述)

    题目要求 P1003题目链接 分析 这题必然是暴力枚举,但关键是怎么枚举...不能没有底线的无脑枚举... 事实上,我们不可能打开一个二维数组,每加一个地毯就把全部元素写进去,那样无论时间还是空间真的 ...

  6. 方程求解(洛谷P1689题题解,Java语言描述)

    题目要求 P1689题目链接 分析 是一个小的模拟题,可以穷举情况并得到答案. 共有六种可能: A+B=XA+B=XA+B=X → X=A+BX=A+BX=A+B A+X=BA+X=BA+X=B → ...

  7. 动态规划求解限时采药问题(洛谷P1048题题解,Java语言描述)

    题目要求 P1048题目链接 分析 荐读:大神博文 -> <聊聊动态规划与记忆化搜索> 这题就是一个标准的DP水题,对于不会DP的萌新,太难了!对于整天搞DP的算法大佬,水爆了! 荐 ...

  8. 贪心 or 动态规划 求解“最大字段和”问题(洛谷P1115题题解,Java语言描述)

    题目要求 P1115题目链接 分析 练习DP,势在必行! 状态转移方程:f[i]=max(f[i−1]+n[i],n[i])f[i]=max(f[i-1]+n[i], n[i])f[i]=max(f[ ...

  9. 打表巧解蛇形方阵(洛谷P5731题题解,Java语言描述)

    题目要求 题目链接 分析 这题固然可以分析归纳,但既然是不大于9的规模,而且复杂度很低,不如--打表? 表自己手算就知道了,很好处理. AC代码(Java语言描述) import java.util. ...

最新文章

  1. LTE-TDD与LTE-FDD技术比较
  2. boost::function_types::is_member_object_pointer的用法测试程序
  3. 管理成本降低10%,且看制造企业如何打造“智慧供应链”
  4. Java工作笔记-JPA中Repository新增自定义更新操作
  5. mysql wb bbu_BBU
  6. 服务器重装系统要注意什么_视频海外服务器前期要准备什么?
  7. 数字证书产品的主题通常含有如下字段
  8. 在 Oracle 中使用正则表达式
  9. iOS开发-OC语言 (七)继承、多态、类别
  10. 训练集误差和验证集误差
  11. 面向法律领域的罪名预测、问题分类与FAQ问答模型设计与实现【NLP】
  12. ubuntu20.04安装burpsuite
  13. 安徽阜阳计算机高中学校排名,安徽省高中学校实力排名
  14. win10 GTX1060 安装CUDA+PyTorch GPU
  15. 给定一个不多于5位的正整数,判断它是几位数,并输出。 输入
  16. 怎样做出完美的高达模型
  17. 前端历程(一)------初识前端
  18. android颜体_颜体楷书结构的四大特征与特点
  19. 尚硅谷-谷粒商城-电商项目-秒杀系统-笔记
  20. [转]常用CASE工具介绍

热门文章

  1. 【一类题】二维数点的几个做法
  2. Manacher【p1210】回文检测
  3. MATLAB GUI不同控件函数间变量传递方法
  4. [转载]Tomcat 6.0 安装配置
  5. dos命令测试网络连通情况
  6. Rails Minitest style 指南
  7. 后台长期运行进程的三种方式
  8. jdbc是java语言编写的类和接口_JDBC——Java语言连接数据库的标准
  9. oracle 关闭数据库实列,Oracle 11g 数据库启动和关闭
  10. cocos2d c 调用java_cocos2d-x之C++ 调用Java函数并接收返回值