http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=96&page=show_problem&problem=951
题意:
在给定字符表里,横竖撇捺八个方向找对应的字符串。
解题:
八个方向直接搜。好长的代码。
下午卡了N久,UVA都崩溃了。一上来就AC了。
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
const int MAXN = 50;
int m, n;
char sz[MAXN+1][MAXN+1];
void strToLower(char str[])
{
for ( int i=0; i<strlen(str); i++ )
{
str[i] = tolower(str[i]);
} // end for
}
void szToLower()
{
for ( int i=0; i<m; i++ )
{
strToLower(sz[i]);
} // end for
}
bool fsearch(char str[], int r, int c)
{
bool bRes;
// →
bRes = true;
if ( c+strlen(str)-1 >= n )
{
bRes = false;
} // end if
else
{
for ( int k=0; k<strlen(str); k++ )
{
if ( !(c+k<n) || (sz[r][c+k] != str[k]) )
{
bRes = false;
break;
} // end if
} // end for
} // end else
if ( bRes ) return bRes;
// ←
bRes = true;
if ( c-strlen(str)+1 < 0 )
{
bRes = false;
} // end if
else
{
for ( int k=0; k<strlen(str); k++ )
{
if ( !(c-k>=0) || (sz[r][c-k] != str[k]) )
{
bRes = false;
break;
} // end if
} // end for
} // end else
if ( bRes ) return bRes;
// ↓
bRes = true;
if ( r+strlen(str)-1 >=m )
{
bRes = false;
} // end if
else
{
for ( int k=0; k<strlen(str); k++ )
{
if ( !(r+k<m) || (sz[r+k][c] != str[k]) )
{
bRes = false;
break;
} // end if
} // end for
} // end else
if ( bRes ) return bRes;
// ↑
bRes = true;
if ( r-strlen(str)+1 < 0 )
{
bRes = false;
} // end if
else
{
for ( int k=0; k<strlen(str); k++ )
{
if ( !(r-k>=0) || (sz[r-k][c] != str[k]) )
{
bRes = false;
break;
} // end if
} // end for
} // end else
if ( bRes ) return bRes;
// ↘
bRes = true;
if ( c+strlen(str)-1 >=n || r+strlen(str)-1 >=m )
{
bRes = false;
} // end if
else
{
for ( int k=0; k<strlen(str); k++ )
{
if ( !(r+k<m) || !(c+k<n) || (sz[r+k][c+k] != str[k]) )
{
bRes = false;
break;
} // end if
} // end for
} // end else
if ( bRes ) return bRes;
// ↖
bRes = true;
if ( c-strlen(str)+1 < 0 || r-strlen(str)+1 < 0 )
{
bRes = false;
} // end if
else
{
for ( int k=0; k<strlen(str); k++ )
{
if ( !(r-k>=0) || !(c-k>=0) || (sz[r-k][c-k] != str[k]) )
{
bRes = false;
break;
} // end if
} // end for
} // end else
if ( bRes ) return bRes;
// ↗
bRes = true;
if ( c+strlen(str)-1 >=n || r-strlen(str)+1 < 0 )
{
bRes = false;
} // end if
else
{
for ( int k=0; k<strlen(str); k++ )
{
if ( !(r-k>=0) || !(c+k<n) || (sz[r-k][c+k] != str[k]) )
{
bRes = false;
break;
} // end if
} // end for
} // end else
if ( bRes ) return bRes;
// ↙
bRes = true;
if ( c-strlen(str)+1 < 0 || r+strlen(str)-1 >=m )
{
bRes = false;
} // end if
else
{
for ( int k=0; k<strlen(str); k++ )
{
if ( !(r+k<m) || !(c-k>=0) || (sz[r+k][c-k] != str[k]) )
{
bRes = false;
break;
} // end if
} // end for
} // end else
if ( bRes ) return bRes;
return false;
}
int main()
{
int nCase;
cin >>nCase;
while ( nCase-- )
{
cin >>m >>n;
cin.ignore();
for ( int i=0; i<m; i++ )
cin.getline(sz[i], MAXN);
szToLower();
int nStr;
cin >>nStr;
while ( nStr-- )
{
char str[MAXN+1];
cin >>str;
strToLower(str);
bool bFind = false;
int i, j;
for ( i=0; i<m; i++ )
{
for ( j=0; j<n; j++ )
{
bFind = fsearch(str, i, j);
if ( bFind ) break;
} // end for
if ( bFind ) break;
} // end for
cout <<i+1 <<' ' <<j+1 <<'\n';
} // end while
if ( nCase != 0 )
{
cout <<'\n';
} // end if
} // end while
}