这个题目也是比较基础的字符串问题,对我来说代码略长了点。不过还好是过了~
//#define LOCAL
#include <stdio.h>
#include <string.h>
#define MAXN 50 + 10
char letters[MAXN][MAXN];
bool isVisited[MAXN][MAXN];
struct Node
{
int x;
int y;
} node;
void findChar(char);
void findWaldorf();
int row, col;
int main()
{
#ifdef LOCAL
freopen("input.txt", "r", stdin);
//freopen("output.txt", "w", stdout);
#endif
int cases;
scanf("%d", &cases);
int i, j;
int k;
for(k = 0; k < cases; k++)
{
// 数据初始化
memset(letters, 0, sizeof(letters));
memset(isVisited, 0, sizeof(isVisited));
// 数据输入
scanf("%d%d", &row, &col);
for(i = 0; i < row; i++)
for(j = 0; j < col; j++)
{
scanf("\n%c", &letters[i][j]);
if(letters[i][j] >= 97)
letters[i][j] = letters[i][j] - 32;
}
// 算法主体
findWaldorf();
// 输出结果
if(k != cases - 1)
printf("\n");
}
return 0;
}
void findWaldorf()
{
int count;
int i;
bool flag = false;
char word[MAXN];
scanf("%d", &count);
while(count--)
{
// 输入单词并将单词转化成大写
memset(word, 0, sizeof(word));
memset(isVisited, 0, sizeof(isVisited));
scanf("%s", word);
for(i = 0; i < strlen(word); i++)
{
if(word[i] >= 97)
word[i] -= 32;
}
node.x = 0;
node.y = 0;
flag = false;
while(!flag)
{
findChar(word[0]);
// 向上比较
if(node.x >= strlen(word) - 1 && !flag)
{
for(i = 0; i < strlen(word); i++)
{
if(letters[node.x - i][node.y] != word[i])
{
flag = false;
break;
}
flag = true;
}
}
// 向左上比较
if(node.x >= strlen(word) - 1 && node.y >= strlen(word) - 1 && !flag)
{
for(i = 0; i < strlen(word); i++)
{
if(letters[node.x - i][node.y - i] != word[i])
{
flag = false;
break;
}
flag = true;
}
}
// 向左比较
if(node.y >= strlen(word) - 1 && !flag)
{
for(i = 0; i < strlen(word); i++)
{
if(letters[node.x][node.y - i] != word[i])
{
flag = false;
break;
}
flag = true;
}
}
// 向右上比较
if(node.x >= strlen(word) - 1 && col - node.y >= strlen(word) && !flag)
{
for(i = 0; i < strlen(word); i++)
{
if(letters[node.x - i][node.y + i] != word[i])
{
flag = false;
break;
}
flag = true;
}
}
// 向右比较
if(col - node.y >= strlen(word) && !flag)
{
for(i = 0; i < strlen(word); i++)
{
if(letters[node.x][node.y + i] != word[i])
{
flag = false;
break;
}
flag = true;
}
}
// 向右下比较
if(row - node.x >= strlen(word) && col - node.y >= strlen(word) && !flag)
{
for(i = 0; i < strlen(word); i++)
{
if(letters[node.x + i][node.y + i] != word[i])
{
flag = false;
break;
}
flag = true;
}
}
// 向下比较
if(row - node.x >= strlen(word)&& !flag)
{
for(i = 0; i < strlen(word); i++)
{
if(letters[node.x + i][node.y] != word[i])
{
flag = false;
break;
}
flag = true;
}
}
// 向左下比较
if(row - node.x >= strlen(word) && node.y >= strlen(word) - 1 && !flag)
{
for(i = 0; i < strlen(word); i++)
{
if(letters[node.x + i][node.y + i] != word[i])
{
flag = false;
break;
}
flag = true;
}
}
}
// 输出结果
printf("%d %d\n", node.x + 1, node.y + 1);
}
}
void findChar(char temp)
{
for(int i = 0; i < col; i++)
for(int j = 0; j < row; j++)
if(letters[j][i] == temp && !isVisited[j][i])
{
node.x = j;
node.y = i;
isVisited[j][i] = true;
return;
}
}