Toggle menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

EditStepLadders/조현태: Difference between revisions

From ZeroWiki
imported>Unknown
No edit summary
 
(Repair batch-0002 pages from live compare)
 
Line 13: Line 13:
  using namespace std;
  using namespace std;
   
   
  const char DEBUG_READ[] = "cat\ndig\ndog\nfig\nfin\nfine\nfog\nlog\nwine\n";
  const char DEBUG_READ[] = "cat\ndig\ndog\nfig\nfin\nfine\nfog\nlog\nwine\n";
  const int MAX_WORD_NUMBER = 25000;
  const int MAX_WORD_NUMBER = 25000;
   
   
Line 35: Line 35:
  if (mapOfLadder.end() != mapOfLadder.find(smallOne * MAX_WORD_NUMBER + bigOne))
  if (mapOfLadder.end() != mapOfLadder.find(smallOne * MAX_WORD_NUMBER + bigOne))
  {
  {
  return mapOfLadder[smallOne * MAX_WORD_NUMBER + bigOne];
  return mapOfLadder[smallOne * MAX_WORD_NUMBER + bigOne];
  }
  }
   
   
  bool myResult = FALSE;
  bool myResult = FALSE;
  int smallLength = strlen(myWords[smallOne]);
  int smallLength = strlen(myWords[smallOne]);
  int bigLength = strlen(myWords[bigOne]);
  int bigLength = strlen(myWords[bigOne]);
  if (smallLength == bigLength)
  if (smallLength == bigLength)
  {
  {
Line 46: Line 46:
  for (register int i = 0; i < bigLength; ++i)
  for (register int i = 0; i < bigLength; ++i)
  {
  {
  if (myWords[smallOne][i] != myWords[bigOne][i])
  if (myWords[smallOne][i] != myWords[bigOne][i])
  ++differenceWordCount;
  ++differenceWordCount;
  }
  }
Line 58: Line 58:
  for (register int i = 0; i < bigLength; ++i)
  for (register int i = 0; i < bigLength; ++i)
  {
  {
  if (myWords[smallOne][i + gab] != myWords[bigOne][i])
  if (myWords[smallOne][i + gab] != myWords[bigOne][i])
  {
  {
  ++differenceWordCount;
  ++differenceWordCount;
Line 74: Line 74:
  for (register int i = 0; i < smallLength; ++i)
  for (register int i = 0; i < smallLength; ++i)
  {
  {
  if (myWords[smallOne][i] != myWords[bigOne][i + gab])
  if (myWords[smallOne][i] != myWords[bigOne][i + gab])
  {
  {
  ++differenceWordCount;
  ++differenceWordCount;
Line 84: Line 84:
  myResult = TRUE;
  myResult = TRUE;
  }
  }
  mapOfLadder[smallOne * MAX_WORD_NUMBER + bigOne] = myResult;
  mapOfLadder[smallOne * MAX_WORD_NUMBER + bigOne] = myResult;
  return myResult;
  return myResult;
  }
  }
Line 121: Line 121:
  for (register int i = 0; i < (int)suchWordList.size(); ++i)
  for (register int i = 0; i < (int)suchWordList.size(); ++i)
  {
  {
  myWordStack.push_back(suchWordList[i]);
  myWordStack.push_back(suchWordList[i]);
  SuchNextWord(myWords, suchWordList[i], myWordStack, bestWordStack);
  SuchNextWord(myWords, suchWordList[i], myWordStack, bestWordStack);
  myWordStack.pop_back();
  myWordStack.pop_back();
  }
  }
Line 131: Line 131:
  int boxNumber = 0;
  int boxNumber = 0;
  const char* readData = DEBUG_READ;
  const char* readData = DEBUG_READ;
  char* myStrings = new char[strlen(readData) + 1];
  char* myStrings = new char[strlen(readData) + 1];
  strcpy(myStrings, readData);
  strcpy(myStrings, readData);
 
 

Latest revision as of 00:16, 27 March 2026

== EditStepLadders/조현태 ==
  === 감상 및 설명 ===
  아아 이 귀차니즘이란..ㅎㅎ..
  소스 중간에 귀차니즘의 압박으로 중복된 부분이 있지만.. 귀찮으니까 수정하진 않도록 하였음.^^
  map을 이용한 캐시가 되어있다.
  아까의 벽돌 문제와 알고리즘이 유사해서 그대로 배껴쓰는 센스를 보였음. ^^V
 === 소스 ===
#include <iostream>
#include <vector>
#include <map>

using namespace std;

const char DEBUG_READ[] = "cat\ndig\ndog\nfig\nfin\nfine\nfog\nlog\nwine\n";
const int MAX_WORD_NUMBER = 25000;

#define TRUE 1
#define FALSE 0

void AddWord(char* readData, vector<const char*>& myWords)
{
	while(0 != *readData && NULL != readData)
	{
		myWords.push_back(readData);
		readData = strchr(readData, '\n');
		*readData = 0;
		++readData;
	}
}

bool IsEditStepLadder(int smallOne, int bigOne, vector<const char*>& myWords)
{
	static map<int, bool> mapOfLadder;
	if (mapOfLadder.end() != mapOfLadder.find(smallOne * MAX_WORD_NUMBER + bigOne))
	{
		return mapOfLadder[smallOne * MAX_WORD_NUMBER + bigOne];
	}

	bool myResult = FALSE;
	int smallLength = strlen(myWords[smallOne]);
	int bigLength = strlen(myWords[bigOne]);
	if (smallLength == bigLength)
	{
		int differenceWordCount = 0;
		for (register int i = 0; i < bigLength; ++i)
		{
			if (myWords[smallOne][i] != myWords[bigOne][i])
				++differenceWordCount;
		}
		if (1 == differenceWordCount)
			myResult = TRUE;
	}
	else if (1 == bigLength - smallLength)
	{
		int differenceWordCount = 0;
		int gab = 0;
		for (register int i = 0; i < bigLength; ++i)
		{
			if (myWords[smallOne][i + gab] != myWords[bigOne][i])
			{
				++differenceWordCount;
				if (1 == differenceWordCount)
					++gab;
			}
		}
		if (1 == differenceWordCount)
			myResult = TRUE;
	}
	else if (-1 == bigLength - smallLength)
	{
		int differenceWordCount = 0;
		int gab = 0;
		for (register int i = 0; i < smallLength; ++i)
		{
			if (myWords[smallOne][i] != myWords[bigOne][i + gab])
			{
				++differenceWordCount;
				if (1 == differenceWordCount)
					++gab;
			}
		}
		if (1 == differenceWordCount)
			myResult = TRUE;
	}
	mapOfLadder[smallOne * MAX_WORD_NUMBER + bigOne] = myResult;
	return myResult;
}

void SuchNextWord(vector<const char*>& myWords, int wordNumber, vector<int>& myWordStack, vector<int>& bestWordStack)
{
	vector<int> suchWordList;
	suchWordList.reserve(myWords.size());
	//// 다음에 나올 단어를 찾아낸다. ////
	if (0 == myWordStack.size())
	{
		for (register unsigned int i = wordNumber + 1; i < myWords.size(); ++i)
			suchWordList.push_back(i);
	}
	else
	{
		for (register unsigned int i = wordNumber + 1; i < myWords.size(); ++i)
		{
			if (IsEditStepLadder(wordNumber, i, myWords))
			{
				suchWordList.push_back(i);
			}
		}
	}
	//// 다음 단어가 없을때. ////
	if (0 == suchWordList.size())
	{
		if (myWordStack.size() > bestWordStack.size())
		{
			bestWordStack = myWordStack;
		}
		return;
	}

	//// 다음 단어를 선택해 봅니다. ////
	for (register int i = 0; i < (int)suchWordList.size(); ++i)
	{
		myWordStack.push_back(suchWordList[i]);
		SuchNextWord(myWords, suchWordList[i], myWordStack, bestWordStack);
		myWordStack.pop_back();
	}
}

void main()
{
	int boxNumber = 0;
	const char* readData = DEBUG_READ;
	char* myStrings = new char[strlen(readData) + 1];
	strcpy(myStrings, readData);
	

	vector<const char*> myWords;
	AddWord(myStrings, myWords);

	vector<int> myWordStack;
	vector<int> bestWordStack;
	SuchNextWord(myWords, 0, myWordStack, bestWordStack);

	cout << bestWordStack.size() << endl;
	delete myStrings;

}

EditStepLadders