您的位置:首页 > 其它

洛谷【1101】单词方阵

2017-04-16 11:47 363 查看
给一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;语句是什么用啊)

)



其他几个位置的y搜索方法类似,图分别如下

2:



3:



4:



5:



6:



7:



引用块内容参考文章:http://m.blog.csdn.net/article/details?id=48650439
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: