10010 - Where's Waldorf?

题目:10010 - Where's Waldorf?


题目大意:在给定的二维字符数组中找给定的字符串的起始位置,寻找方式可以有八个方向(即八个方向都有可能会出现给定的字符串),如果有多个起始位置,选最靠左,靠上的位置;



解题思路:定义一个方位数组用来表示八个方向move【8】【2】,然后在二维字符数组中找到与给定字符串的头个字符相同的位置,然后从这里开始八个方向的寻找是否有这个字符串在字符数组里,有的话则返回头个字符的位置,没有就继续找;要注意每个case输出后都要输出回车,还有可以将字符数组和字符串转换成都大写字母或都小写字母,方便比较;

#include<stdio.h>
#include<string.h>

int move[8][2]={{-1,0},{1,0},{0,-1},{0,1},{1,-1},{1,1},{-1,1},{-1,-1}};
char arrary[55][55];
char s[2];
char a[55];

bool judge( char  *a, int n, int m) {

	int number=strlen(a);

	int i, j, l, h, g, k;
	for (i = 0; i<n ;i++)
		for(j = 0;j<m; j++) 
		{
		
			if(arrary[i][j]==a[0]) 
			{

				k = i; l = j;
				for(h = 0; h<8; h++) 
				{
				
					for(g = 0; g<number; g++, i += move[h][0], j += move[h][1])
					{
						if((i>=0 && i<n) && (j>=0 && j<m)) 
						{
							if(a[g] != arrary[i][j]) break;
						}
						else
							break;
					}
					if(g==number) 
					{
							s[0] = k+1; s[1] = l+1; return true;
					}
					else 
					{
						i = k; j = l;
					}
					

				}
	
			}

		}
		return false;
}
void change(char * s) {
	int len = strlen(s);
	int i;
	for (i = 0; i<len; i++)
		if(s[i] >= 'a'&&s[i] <= 'z')
			s[i]-=32;
}
int main() {

	int numcase, i, m, n, l, j;
	scanf("%d", &numcase);
	memset(arrary, 0, sizeof(arrary));  
    memset(a, 0, sizeof(a)); 

	for (i = 0; i < numcase; i++) {

		scanf("%d %d", &n, &m);
		for(j = 0; j <n; j++) 
			scanf("%s", arrary[j]);

		for(j = 0; j<n; j++)
		change(arrary[j]);


		int num;
		scanf("%d", &num);

		for (j = 0; j < num; j++) {

			scanf("%s", a);
			change(a);
	
			if(judge(a, n, m))
				printf("%d %d\n",s[0], s[1]);
			 memset(a, 0, sizeof(a)); 
		}
		if(i!=numcase-1)
				printf("\n");
	}
	
	return 0;
}


你可能感兴趣的:(10010 - Where's Waldorf?)