Abstract. While computer science and engineering students are trained to recognise familiar problems with known solutions, they may not be sufficiently prepared to address novel real-world problems. A successful computer science graduate does far more than just program and we must train our students to reach the required levels of analytical and computational thinking, rather than hoping that it will just 'develop'. As a step in this direction, we have created and experimented with a new first-year level course, Puzzle-based Learning (PBL), that is aimed at getting students to think about how to frame and solve unstructured problems. The pedagogical goal is increase students' mathematical awareness and general problem solving skills by employing puzzles, which are educational, engaging, and thought provoking. In this paper we continue sharing our experiences in teaching such a course. Whereas a brief discussion on our pedagogical objectives were covered in the first paper together with the material of the first of two lectures on pattern recognition, this follow-up paper presents the material of the second of two lectures, in which additional exercises are discussed to reinforce the lesson. Along the way we provide a glimpse of some foundational ideas of computer science such as incomputability and general system development strategies such as incremental and iterative reasoning. This paper discusses the outcomes of PBL courses, which include expected improvement in the overall results achieved by students who have undertaken PBL courses, compared to those students who have not.