UVA 之10010 - Where's Waldorf?

 Where‘s Waldorf? 

Given a m by n grid
of letters, ( ),
and a list of words, find the location in the grid at which the word can be found. A word matches a straight, uninterrupted line of letters in the grid. A word can match the letters in the grid regardless of case (i.e. upper and lower case letters are to be
treated as the same). The matching can be done in any of the eight directions either horizontally, vertically or diagonally through the grid.

Input

The input begins with a single positive integer on a line by itself indicating the number of the cases following, each of them as described below. This line is followed by a blank line, and
there is also a blank line between two consecutive inputs.

The input begins with a pair of integers, m followed by n in
decimal notation on a single line. The next m lines contain n letters each; this is the grid of letters in which the words of the list must be found. The letters in the grid may be in upper or lower case. Following the grid of letters, another
integer k appears on a line by itself ( ). The next k lines of
input contain the list of words to search for, one word per line. These words may contain upper and lower case letters only (no spaces, hyphens or other non-alphabetic characters).

Output

For each test case, the output must follow the description below. The outputs of two consecutive cases will be separated by a blank line.

For each word in the word list, a pair of integers representing the location of the corresponding word in the grid must be output. The integers must be separated by a single space. The first integer is the line in the grid where the first letter of the given
word can be found (1 represents the topmost line in the grid, and m represents the bottommost line). The second integer is the column in the grid where the first letter of the given word can be found (1 represents the leftmost column in the grid,
and n represents the rightmost column in the grid). If a word can be found more than once in the grid, then the location which is output should correspond to the uppermost occurence of the word (i.e. the occurence which places the first letter of
the word closest to the top of the grid). If two or more words are uppermost, the output should correspond to the leftmost of these occurences. All words can be found at least once in the grid.

Sample
Input

1

8 11
abcDEFGhigg
hEbkWalDork
FtyAwaldORm
FtsimrLqsrc
byoArBeDeyv
Klcbqwikomk
strEBGadhrb
yUiqlxcnBjf
4
Waldorf
Bambi
Betty
Dagbert

Sample
Output

2 5
2 3
1 2
7 8

Miguel Revilla

2000-08-22

【大意】:

输入:

给你一个由字母组成的网格,M行N列。寻找一个单词在网格中的位置。一个单词匹配网格中联系不间断的字母。可以沿任意方向匹配,一共可以匹配八个方向。忽略大小写。

需要匹配的字符串有K个。

输出:

每组输出之间都一行空行。

m n:m代表匹配的最上面的行

n代表匹配的最下面的行

如果结果有多个,只输出匹配串。要求:匹配串的第一个字母必须是最高最左的。结果至少有一个。

【代码】:

[cpp] view
plain
copy

  1. /*********************************
  2. *   日期:2013-4-23
  3. *   作者:SJF0115
  4. *   题号: 题目10010 - Where‘s Waldorf?
  5. *   来源:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=12&page=show_problem&problem=951
  6. *   结果:AC
  7. *   来源:UVA
  8. *   总结:
  9. **********************************/
  10. #include<stdio.h>
  11. #include<string.h>
  12. char Matrix[51][51];
  13. char str[21],temp[21];
  14. int StartR,StartC;
  15. //M行 N列
  16. int Match(int M,int N,int &StartR,int &StartC){
  17. int i,j,k,flag;
  18. StartR = 51,StartC = 51;
  19. int len = strlen(str);
  20. for(i = 0;i < M;i++){
  21. for(j = 0;j < N;j++){
  22. flag = 1;
  23. //left - right
  24. if(j + len <= N){
  25. flag = 0;
  26. for(k = 0;k < len;k++){
  27. if(str[k] != Matrix[i][j+k]){
  28. flag = 1;
  29. break;
  30. }
  31. }
  32. if(flag == 0){
  33. if(StartR >  i+1){
  34. StartR = i+1;
  35. StartC = j+1;
  36. }
  37. else if(StartR ==  i+1 && StartC > j+1){
  38. StartR = i+1;
  39. StartC = j+1;
  40. }
  41. }
  42. }
  43. //right - left
  44. if(j - len + 1>= 0){
  45. flag = 0;
  46. for(k = 0;k < len;k++){
  47. if(str[k] != Matrix[i][j-k]){
  48. flag = 1;
  49. break;
  50. }
  51. }
  52. if(flag == 0){
  53. if(StartR >  i+1){
  54. StartR = i+1;
  55. StartC = j+1;
  56. }
  57. else if(StartR ==  i+1 && StartC > j+1){
  58. StartR = i+1;
  59. StartC = j+1;
  60. }
  61. }
  62. }
  63. //up - down
  64. if(i + len <= M){
  65. flag = 0;
  66. for(k = 0;k < len;k++){
  67. if(str[k] != Matrix[i+k][j]){
  68. flag = 1;
  69. break;
  70. }
  71. }
  72. if(flag == 0){
  73. if(StartR >  i+1){
  74. StartR = i+1;
  75. StartC = j+1;
  76. }
  77. else if(StartR ==  i+1 && StartC > j+1){
  78. StartR = i+1;
  79. StartC = j+1;
  80. }
  81. }
  82. }
  83. //down - up
  84. if(i - len + 1 >= 0){
  85. flag = 0;
  86. for(k = 0;k < len;k++){
  87. if(str[k] != Matrix[i-k][j]){
  88. flag = 1;
  89. break;
  90. }
  91. }
  92. if(flag == 0){
  93. if(StartR >  i+1){
  94. StartR = i+1;
  95. StartC = j+1;
  96. }
  97. else if(StartR ==  i+1 && StartC > j+1){
  98. StartR = i+1;
  99. StartC = j+1;
  100. }
  101. }
  102. }
  103. //right - up
  104. if(j + len <= N && i - len + 1 >= 0){
  105. flag = 0;
  106. for(k = 0;k < len;k++){
  107. if(str[k] != Matrix[i-k][j+k]){
  108. flag = 1;
  109. break;
  110. }
  111. }
  112. if(flag == 0){
  113. if(StartR >  i+1){
  114. StartR = i+1;
  115. StartC = j+1;
  116. }
  117. else if(StartR ==  i+1 && StartC > j+1){
  118. StartR = i+1;
  119. StartC = j+1;
  120. }
  121. }
  122. }
  123. //right - down
  124. if(j + len <= N && i + len <= M){
  125. flag = 0;
  126. for(k = 0;k < len;k++){
  127. if(str[k] != Matrix[i+k][j+k]){
  128. flag = 1;
  129. break;
  130. }
  131. }
  132. if(flag == 0){
  133. if(StartR >  i+1){
  134. StartR = i+1;
  135. StartC = j+1;
  136. }
  137. else if(StartR ==  i+1 && StartC > j+1){
  138. StartR = i+1;
  139. StartC = j+1;
  140. }
  141. }
  142. }
  143. //left - up
  144. if(j - len + 1 >= 0 && i - len + 1 >= 0){
  145. flag = 0;
  146. for(k = 0;k < len;k++){
  147. if(str[k] != Matrix[i-k][j-k]){
  148. flag = 1;
  149. break;
  150. }
  151. }
  152. if(flag == 0){
  153. if(StartR >  i+1){
  154. StartR = i+1;
  155. StartC = j+1;
  156. }
  157. else if(StartR ==  i+1 && StartC > j+1){
  158. StartR = i+1;
  159. StartC = j+1;
  160. }
  161. }
  162. }
  163. //left - down
  164. if(j - len + 1 >= 0 && i + len <= M){
  165. flag = 0;
  166. for(k = 0;k < len;k++){
  167. if(str[k] != Matrix[i-k][j+k]){
  168. flag = 1;
  169. break;
  170. }
  171. }
  172. if(flag == 0){
  173. if(StartR >  i+1){
  174. StartR = i+1;
  175. StartC = j+1;
  176. }
  177. else if(StartR ==  i+1 && StartC > j+1){
  178. StartR = i+1;
  179. StartC = j+1;
  180. }
  181. }
  182. }
  183. }//for j
  184. }//for i
  185. return 0;
  186. }
  187. int main (){
  188. int i,j,Case,k,M,N;
  189. //freopen("C:\\Users\\XIAOSI\\Desktop\\acm.txt","r",stdin);
  190. while(scanf("%d",&Case) != EOF){
  191. while(Case--){
  192. scanf("%d %d",&M,&N);
  193. //输入字符矩阵
  194. for(i = 0;i < M;i++){
  195. scanf("%s",temp);
  196. for(j = 0;j < N;j++){
  197. Matrix[i][j] = temp[j];
  198. //转换为小写
  199. if(Matrix[i][j] >= ‘A‘ && Matrix[i][j] <= ‘Z‘){
  200. Matrix[i][j] = Matrix[i][j] - ‘A‘ + ‘a‘;
  201. }
  202. }
  203. }
  204. scanf("%d",&k);
  205. //待匹配串
  206. for(i = 0;i < k;i++){
  207. scanf("%s",str);
  208. int len = strlen(str);
  209. //转换为小写
  210. for(j = 0;j < len;j++){
  211. if(str[j] >= ‘A‘ && str[j] <= ‘Z‘){
  212. str[j] = str[j] - ‘A‘ + ‘a‘;
  213. }
  214. }
  215. //printf("%s",str);
  216. Match(M,N,StartR,StartC);
  217. printf("%d %d\n",StartR,StartC);
  218. }
  219. //每组测试之间有空行
  220. if(Case){
  221. printf("\n");
  222. }
  223. }
  224. }
  225. return 0;
  226. }

UVA 之10010 - Where's Waldorf?,布布扣,bubuko.com

UVA 之10010 - Where's Waldorf?

时间: 2024-08-10 21:28:59

UVA 之10010 - Where's Waldorf?的相关文章

uva 10010 - Where&#39;s Waldorf?

#include<iostream> #include<cctype> #include<algorithm> using namespace std; char a[55][55]; string s[22]; int T,m,n,k; int mx[] = {1, 1, 1, 0, 0, -1, -1, -1}; int my[] = {1, 0, -1, 1, -1, 1, 0, -1}; bool in(int x,int y){ return x>=1&

UvaOJ 10010 Where&#39;s Waldorf?

Given a m by n grid of letters, ( ), and a list of words, find the location in the grid at which the word can be found. A word matches a straight, uninterrupted line of letters in the grid. A word can match the letters in the grid regardless of case

UVA题目分类

题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics 10300 - Ecological Premium 458 - The Decoder 494 - Kindergarten Counting Game 414 - Machined Surfaces 490 - Rotating Sentences 445 - Marvelous Mazes

计划,,留

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinejudge.org 西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ. 一.<算法竞赛入门经典> 刘汝佳 (UVaOJ 351道题) 以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html "AOAPC I"

算法竞赛入门经典+挑战编程+USACO

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发.   一.UVaOJ http://uva.onlinejudge.org  西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ.   二.<算法竞赛入门经典> 刘汝佳  (UVaOJ  351道题)  以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html   "AO

编程题目分类(剪辑)

1. 编程入门 2. 数据结构 3. 字符串 4. 排序 5. 图遍历 6. 图算法 7. 搜索:剪枝,启发式搜索 8. 动态规划/递推 9. 分治/递归 10. 贪心 11. 模拟 12. 算术与代数 13. 组合问题 14. 数论 15. 网格,几何,计算几何 [编程入门] PC 110101, uva 100, The 3n+1 problem, 难度 1 PC 110102, uva 10189, Minesweeper, 难度 1 PC 110103, uva 10137, The T

(Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinejudge.org 西班牙Valladolid大学的程序在线评测系统,是历史最悠久.最著名的OJ. 二.<算法竞赛入门经典> 刘汝佳  (UVaOJ  351道题)  以下部分内容摘自:http://sdkdacm.5d6d.com/thread-6-1-1.html “AOAPC I”是刘汝佳(大

UVA 10010- Where&#39;s Waldorf?(八方向寻找字符串)

Where's Waldorf? Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Description  Where's Waldorf?  Given a m by n grid of letters, ( ), and a list of words, find the location in the grid at which the word can be foun

UVA 10010-- Where&#39;s Waldorf?--暴力串处理

 Where's Waldorf?  Given a m by n grid of letters, ( ), and a list of words, find the location in the grid at which the word can be found. A word matches a straight, uninterrupted line of letters in the grid. A word can match the letters in the grid