Unleashing the potential of prompt engineering in Large Language Models: a comprehensive review