洛谷【1101】单词方阵

来源:互联网 发布:mysql 连续 天 统计 编辑:程序博客网 时间:2024/05/23 19:15

给一nXn的字母方阵,内可能蕴含多个“yizhong”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间[color=red]可以[/color]交叉,因此有可能共用字母。输出时,将不是单词的字母用“*”代替,以突出显示单词。例如:

输入:
8 输出:
qyizhong *yizhong
gydthkjy gy******
nwidghji n*i*****
orbzsfgz o**z****
hhgrhwth h***h***
zzzzzozo z****o**
iwdfrgng i*****n*
yyyygggg y******g
输入输出格式

输入格式:
第一行输入一个数n。(7<=n<=100)。

第二行开始输入nXn的字母矩阵。

输出格式:
突出显示单词的nXn矩阵。

输入输出样例

输入样例#1:
7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
输出样例#1:








这是一道深搜的题目,在洛谷题解中很多人用的是枚举,这里还是以练习深搜为主用深搜思路做

分析:
找到y后搜索8个方向,如果(有等于i的继续沿着这个方向向下搜索看是否继续与
“yizhong”这个字符串后面的字符相等。如果计数器累计等于7,说明7个字符都相等了。那么回溯标记数组vis记为1。) 如果(没有等于i的换个方向继续搜索。)
这样在输出结果的时候,如果遇见标记数组vis等于1的时候就输出字符,否则就输出’*’。

代码:
Ubuntu链接:
http://paste.ubuntu.com/24391322/

运行结果:
*yizhong
gy******
n*i*****
o**z****
h***h***
z****o**
i*****n*
y******g

细节分析(人工debug):
可以看见在第一次时找到y位置为(0,1)
按照dx[0],dy[0]搜索找到i,于是在此方向上继续搜索。
(此时f!=-1,应执行下面的那几句深搜语句
【即在上面第一次f=-1是为了找方向,下面是找到了方向以后按照这个方向搜索看是否可以记录下7个字符,如果记录下来
(在if(s==7)里回溯标记vis数组,注意此时xx,yy都是同名局部变量,所以尽管回溯到最低时,外面的搜索语句还是在s=7时的xx,yy继续向下搜索到不满足条件时
(按照栈的方式,自己回溯))】
可以看见,此时转到打印出语句:其他1 f0 xx 0 yy 8到达搜索边界,回溯调用栈
一直回溯到打印出语句:第一次后 f 0 xx 0 yy 2(回到线性搜索最初i的位置)
继续搜索其他方向,可以看见打印出语句如:第一次前 f 1 xx 0 yy 0等等
在第一次搜索中其他7个方向均没有满足条件的,因此在打印出语句如下:
f 7 xx -1 yy 0后就退出本次搜索了。
(但是我一直有个疑问:那些搜索里加的return;语句是什么用啊)
)
1
其他几个位置的y搜索方法类似,图分别如下
2:
2
3:
3
4:
4
5:
5
6:
6
7:
7

引用块内容参考文章:http://m.blog.csdn.net/article/details?id=48650439

0 0
原创粉丝点击