10010 Where's Waldorf?

本文介绍了一个使用八方向查找算法解决单词搜索问题的C语言程序。该程序能够在矩阵中搜索指定单词,并输出单词起始位置。文章详细展示了算法实现过程及调试经历,包括逻辑错误修正、输出格式调整等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题就是8个方向都找找吧.

感觉写起来还比较顺,不过逻辑错误处处都是.

最开始写出来的代码,输出来的数都要少1,因为没考虑到c的数组下标都是从0开始的,所以输出的时候,都加上1就行了.

一开始还没写break语句,导致用测试数据的时候,输出还多了一组= =||

看着都要AC了,可还是不对,找了份别人源码,更多的数据一对比,才发现自己多输出有空行.

这道题以及上一道都存在输出格式问题,都耽误了很多时间.

看来以后读题要多注意. 这两道题也写得很凌乱,看来先写写伪代码还是有必要的.

#include<stdio.h>
#include
<ctype.h>
#include
<string.h>
const int maxn = 100;
int main()
{
#ifdef LOCAL
freopen(
"input.txt", "r", stdin);
#endif
int t;
int m, n;
int t_k;
int ok = 0;//判断某个单词是否已找到字母
char s[maxn][50];
char word[20][50];
scanf(
"%d", &t);
while(t-- > 0)
{
scanf(
"%d%d", &m, &n);
for(int i = 0; i < m; i++) scanf("%s", s[i]);
scanf(
"%d", &t_k);
for(int i = 0; i < t_k; i++) scanf("%s", word[i]);
//8个方向寻找
for(int i = 0; i < t_k; i++)
{
//找到符合第一个字母的字母,并判断
ok = 0;
for(int j = 0; j < m && !ok; j++)
for(int k = 0; k < n && !ok; k++)
if(toupper(s[j][k]) == toupper(word[i][0]))
{
int p, q;
int len_check, len = strlen(word[i]);
//判断顺序:斜上偏左,斜下偏右,斜下偏左,斜上偏右,上,下,左,右
for(p = j-1, q = k-1, len_check = 1; p >= 0 && q >= 0; --p, --q)
{
if(toupper(s[p][q]) == toupper(word[i][len_check])) len_check++;
else break;
if(len_check == len) { printf("%d %d\n", j+1, k+1); ok = 1; }
}
//从下一个方向,如果len_check == len,就结束循环,避免重复输出
for(p = j+1, q = k+1, len_check = 1; p <= m && q <= n && !ok; ++p, ++q)
{
if(toupper(s[p][q]) == toupper(word[i][len_check])) len_check++;
else break;
if(len_check == len) { printf("%d %d\n", j+1, k+1); ok = 1; }
}

for(p = j+1, q = k-1, len_check = 1; p <= m && q >= 0 && !ok; ++p, --q)
{
if(toupper(s[p][q]) == toupper(word[i][len_check])) len_check++;
else break;
if(len_check == len) { printf("%d %d\n", j+1, k+1); ok = 1; }
}

for(p = j-1, q = k+1, len_check = 1; p >= 0 && q <= n && !ok; --p, ++q)
{
if(toupper(s[p][q]) == toupper(word[i][len_check])) len_check++;
else break;
if(len_check == len) { printf("%d %d\n", j+1, k+1); ok = 1; }
}

for(p = j-1, q = k, len_check = 1; p >= 0 && !ok; --p)
{
if(toupper(s[p][q]) == toupper(word[i][len_check])) len_check++;
else break;
if(len_check == len) { printf("%d %d\n", j+1, k+1); ok = 1; }
}

for(p = j+1, q = k, len_check = 1; p <= m && !ok; ++p)
{
if(toupper(s[p][q]) == toupper(word[i][len_check])) len_check++;
else break;
if(len_check == len) { printf("%d %d\n", j+1, k+1); ok = 1; }
}

for(p = j, q = k-1, len_check = 1; q >= 0 && !ok; --q)
{
if(toupper(s[p][q]) == toupper(word[i][len_check])) len_check++;
else break;
if(len_check == len) { printf("%d %d\n", j+1, k+1); ok = 1; }
}

for(p = j, q = k+1, len_check = 1; q <= n && !ok; ++q)
{
if(toupper(s[p][q]) == toupper(word[i][len_check])) len_check++;
else break;
if(len_check == len) { printf("%d %d\n", j+1, k+1); ok = 1; }
}
}
}
if(t > 0) printf("\n");//每处理完一组空行
}
return 0;
}

转载于:https://www.cnblogs.com/shixuehunk/archive/2011/07/19/2110473.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值