1216. [S/W 문제해결 기본] 3일차 - 회문2


문제링크

[풀이]

#include <iostream>
#include <cstdio>
using namespace std;
#define MAXN 100
int T, Q, sol;
char MAP[MAXN][MAXN + 1];

#define INBOUND(i, length) (i + length - 1 < MAXN)
int _maxlen;

void solve() {
	for (int i = 0; i < MAXN; ++i) {
		for (int j = 0; j < MAXN; ++j) {
		
			for (int len =2; len <= 100 - j; len++) {
				// 가로로 len 길이만큼 탐색, 팰린드롬이 아닐 경우 즉시 탈출
				if (!INBOUND(j, len)) break;
				/*bool flag = false;*/
				for (int k = 0; k < len / 2; k++) {
					//printf("가로 : [%d, %d] [%d, %d]\n", i, j + k, i, j + len - k - 1);
					if (MAP[i][j + k] != MAP[i][j + len - k - 1]) {
						//flag = true;
						break;
					}
					if (k == len / 2 - 1) {
						_maxlen = len > _maxlen ? len : _maxlen;
					}
				}
				//if (flag) break;				
			}
	
		}
	}
	for (int i = 0; i < MAXN; ++i) {
		for (int j = 0; j < MAXN; ++j) {

			for (int len = 2; len <= 100 - j; len++) {
				// 세로로 len 길이만큼 탐색, 팰린드롬이 아닐 경우 즉시 탈출
				if (!INBOUND(j, len)) break;

				//bool flag = false;
				for (int k = 0; k < len / 2; k++) {
					//printf("가로 : [%d, %d] [%d, %d]\n", j + k, i, j + len - k -1, i);

					if (MAP[j + k][i] != MAP[j + len - k - 1][i]) {
						//flag = true;
						break;
					}
					if (k == len / 2 - 1) {
						_maxlen = len > _maxlen ? len : _maxlen;
					}
				}
				//if (flag) break;
			}
		}
	}
}

int main() {
	T = 10;
	for (int i = 1; i <= 10; ++i) {
		cin >> Q;
		for (int i = 0; i < MAXN; ++i) {
			cin >> MAP[i];
		}
		_maxlen = 1;
		solve();
		printf("#%d %d\n", i, _maxlen);
	}
}





© 2020.02. by blupine