字符串-10010 Where’s Waldorf

题目大意:给定m*n的字母网格,给出需要找到的单词,按照八个方向分别查找,但是与普通的广搜或者深搜区别,方向始终保持一致,不弯曲,不交叉,找出最上最左的第一个字母位置

解题过程:一次AC,但是在调试过程中费了一点功夫,因为对scanf和printf还不熟,scanf按地址传递,printf直接打印

正确代码:

# include <cstdio>
# include <cstring>
# include <ctype.h>
# include <string>
# include <iostream>
//# define LOCAL
using namespace std;
char grid[60][60];
int dir[8][2]={{-1,-1},{-1,0},{-1,1,},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
int main(){
	# ifdef LOCAL
	freopen("in.txt","r",stdin);
	freopen("out.txt","w",stdout);
	#endif
	int a,n,m,k,j;
	scanf("%d",&a);
//	printf("%d\n",a);
	while(a){
		a--;
		scanf("%d%d",&m,&n);
//		printf("%d %d\n",m,n);
		char temp[n+1]; 
		for(int i=0;i<m;i++){
			scanf("%s",temp);
			for(int j=0;j<n;j++){
				grid[i][j]=temp[j];
//				printf("%c",grid[i][j]);
			}
//			printf("\n"); 
		}
		scanf("%d",&k);
//		printf("%d\n",k);
		char (* word)[60]=new char[k][60];
		for(int i=0;i<k;i++){
			scanf("%s",word[i]);
//			printf("%s\n",word[i]);
		}
		int numofword=0;
		while(numofword<k){
			int len=strlen(word[numofword]);
			int row=0,col=0;
			int pos=0;
			while(pos<len){
				for(int i=0;i<8;i++){
					if(row+dir[i][0]*(len-1)>=m||row+dir[i][0]*(len-1)<0||col+dir[i][1]*(len-1)>=n||col+dir[i][1]*(len-1)<0)
						continue;
					for(j=0;j<len;j++){
						if(grid[row+dir[i][0]*j][col+dir[i][1]*j]==toupper(word[numofword][j])||grid[row+dir[i][0]*j][col+dir[i][1]*j]==tolower(word[numofword][j]))
							continue;
						break;
					}
					if(j==len){
						pos=len;
						break;
					}
				}
				if(pos!=len){
					row+=(col+1)/n;
					col=(col+1)%n;
				}
			}
			printf("%d %d\n",row+1,col+1);
			numofword++;
		}
		if(a>0)	printf("\n");
	}
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值