UVA - 10010 Where’s Waldorf?
写的很繁琐,代码很冗长。
题目大意:给一段字符串,作用类似棋盘,在这段字符串中找出给定字段最近的位置。
解题思路:暴力求,八个方向全写。先查首字母,找到相同的就查第二个字母在八个方向的哪个方向能对应,以此类推。
注意点:一开始没有考虑到所查找的字段只有一个字符的情况,这样,第二个字母就是’\0’,那么原先判断第二个字母是否相等时,只会找棋盘边界的位置了(’\0’对应’\0’)坑了很久很久。 QAQ
#include<iostream>
#include<cstdio>
#include<string.h>
#include<ctype.h>
using namespace std;
int main() {
int h , m , n , k , col, li;
int i , j , g , l ;
char s[10000][60] , sk[50][1000];
bool flag;
cin >> h;
while( h--) {
cin >> m >> n;
for( i = 0 ; i < m ; i++) {
cin >> s[i];
for (j = 0; j < n ; j++ )
s[i][j] = tolower(s[i][j]);
}
cin >> k;
for( i = 0 ; i < k; i++){
cin >> sk[i];
for (j = 0; j < strlen(sk[i]) ; j++ )
sk[i][j] = tolower(sk[i][j]);
}
for( g = 0 ; g < k ; g++ ) {
l = 0 ;
for( i = 0; i < m; i++ ) {
for( j = 0; j < n ; j++) {
if( sk[g][l] == s[i][j] ) {
li = i+1; col = j+1;flag = 0;
if( sk[g][l+1] == '\0') {flag = 1;goto one;}
else{
if( sk[g][l+1] == s[i][j+1] ) {
for( ; l < strlen(sk[g]) ;l++,j++) {
if( sk[g][l] == s[i][j]) flag = 1;
else { flag = 0;i = li-1 ; j = col - 1;l=0;break; }
}
if ( flag == 1 ) break;
}
if(sk[g][l+1] == s[i][j-1] ) {
for(; l < strlen(sk[g]) ;l++,j-- ) {
if( sk[g][l] == s[i][j]) flag = 1;
else { flag = 0;i = li-1 ; j = col - 1;l=0;break; }
}
if ( flag == 1 ) break;
}
i = li-1 ; j = col - 1;l=0;
if(sk[g][l+1] == s[i+1][j] ) {
for(; l < strlen(sk[g]) ;l++,i++ ) {
if( sk[g][l] == s[i][j]) flag = 1;
else { flag = 0;i = li-1 ; j = col - 1;l=0;break; }
}
if ( flag == 1 ) break;
}
i = li-1 ; j = col - 1;l=0;
if(sk[g][l+1] == s[i-1][j] ) {
for(; l < strlen(sk[g]) ;l++, i--) {
if( sk[g][l] == s[i][j]) flag = 1;
else { flag = 0;i = li-1 ; j = col - 1;l=0;break; }
}
if ( flag == 1 ) break;
}
if(sk[g][l+1] == s[i+1][j+1] ) {
for(; l < strlen(sk[g]) ;l++, j++, i++) {
if( sk[g][l] == s[i][j]) flag = 1;
else { flag = 0;i = li-1 ; j = col - 1;l=0;break; }
}
if ( flag == 1 ) break;
}
i = li-1 ; j = col - 1;l=0;
if(sk[g][l+1] == s[i+1][j-1] ) {
for(; l < strlen(sk[g]) ;l++, i++, j--) {
if( sk[g][l] == s[i][j]) flag = 1;
else { flag = 0;i = li-1 ; j = col - 1;l=0;break; }
}
if ( flag == 1 ) break;
}
i = li-1 ; j = col - 1;l=0;
if(sk[g][l+1] == s[i-1][j+1] ) {
for(; l < strlen(sk[g]) ;l++, i-- ,j++ ) {
if( sk[g][l] == s[i][j]) flag = 1;
else { flag = 0;i = li-1 ; j = col - 1;l=0;break; }
}
if ( flag == 1 ) break;
}
if(sk[g][l+1] == s[i-1][j-1] ) {
for(; l < strlen(sk[g]) ;l++, i--,j--) {
if( sk[g][l] == s[i][j]) flag = 1;
else { flag = 0;i = li-1 ; j = col - 1;l=0;break; }
}
if(flag == 1) break;
}
}
}
if(!flag) continue;
}
}
one:
if(flag) cout << li << " " << col<<endl;
if(h&&!(k-g-1)) cout << endl;
}
//cout<<"lll"<<endl;
}
return 0;
}