오늘의 알고리즘

[C++] 백준 1987 알파벳

하늘하늘 . 2022. 5. 23. 17:09
 
#include <iostream>
#include <string.h>
#include <vector>
#include <stack>
#include <tuple>
 
int R = 0;
int C = 0;
std::vector<std::string> vec = {};
bool visit[27] = {};
int iDirX[4] = { 0,0,1,-1 };
int iDirY[4] = { 1,-1,0,0 };
 
void CheckStack(int iCount, int iX, int iY, int& answer)
{
	answer = std::max(answer, iCount);
 
	for (int i = 0; i < 4; ++i)
	{
		int iNextX = iX + iDirX[i];
		int iNextY = iY + iDirY[i];
 
		if (iNextX >= 0 && iNextX < R &&
			iNextY >= 0 && iNextY < C)
		{
			if (!visit[vec[iNextX][iNextY] - 'A'])
			{
				visit[vec[iNextX][iNextY] - 'A'] = true;
				CheckStack(iCount + 1, iNextX, iNextY, answer);
				visit[vec[iNextX][iNextY] - 'A'] = false;
			}
		}
	}
}
 
int main()
{
	int iAnswer = 0;
 
	std::cin >> R >> C;
 
	for (int i = 0; i < R; ++i)
	{
		std::string s = {};
		std::cin >> s;
		vec.push_back(s);
	}
 
	visit[vec[0][0] - 'A'] = true;
 
	CheckStack(1, 0, 0, iAnswer);
 
	std::cout << iAnswer;
}

1. string 형식이라 'A'를 빼고난 방식이 중요했다.

2. DFS로 기억해나가면서 풀어야했다.