lunes, 24 de octubre de 2011

10010 - Where's Waldorf?, uva

#include<iostream>
#include<cstdio>
#include<cctype>
#include<cmath>
#include<vector>
#include<map>
#include<utility>
#include<algorithm>
#define db(a) cout << #a << " = " << a << endl;
#define db2(a, b) cout << #a << " = " << a << "  " << #b << " = " << b << endl;
#define foreach(it, l) for(typeof(l.begin()) it = l.begin(); it != l.end(); it++)
using namespace std;
char matriz[50][50];
int main() {
    int t, m, n, k;
    scanf("%d\n", &t);
	map > mapa;
    for(int r = 0; r < t; r++){
		if(r != 0) printf("\n");
		mapa.clear();
        scanf("%d %d\n", &m, &n);
        for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
                scanf("%c", &matriz[i][j]);
				matriz[i][j] = tolower(matriz[i][j]);
            }
			getchar();
        }
		scanf("%d", &k);
		vector words(k);
		vector found(k, false);
		for (int i = 0; i < k; i++) {
			cin >> words[i];
			transform(words[i].begin(), words[i].end(), words[i].begin(), ::tolower);
		}
		getchar();
		//solution
		bool ok = false;
		for(int i = 0; i < m; i++) {
            for(int j = 0; j < n; j++) {
				for(int v = 0; v < k; v++){
					if(found[v]) continue;
					int tam = words[v].size();
					ok = false;
					for(int x = -1; x <= 1 && !ok; x++){
						for(int y = -1; y <= 1 && !ok; y++){
							if(x == 0 && y == 0 && tam != 1) continue;
							if(i + tam * x >= -1 && i + tam * x <= m)
								if(j + tam * y >= -1 && j + tam * y <= n){
									ok = true;
									for(int s = 0; s < tam & ok; s++){
										if(words[v][s] != matriz[i + s * x][j + s * y]) ok = false;
									}
									if(ok) found[v] = true;
									if(ok) mapa[words[v]].first = i + 1, mapa[words[v]].second = j + 1;
								}
						}
					}
				}
            }
        }
		for(int i = 0; i < words.size(); i++){
			if(mapa[words[i]].first != 0)
				printf("%d %d\n", mapa[words[i]].first, mapa[words[i]].second);  
		}
    }
    return 0;
}

No hay comentarios:

Publicar un comentario