Go: package main

import (
	"fmt"
	"strconv"
)

func main() {
	for _, leftValue := range MultiplicationTableNum(9) {
		for _, rightValue := range MultiplicationTableNum(9) {
			strLeftVal, strRightVal, strMulti := strconv.Itoa(leftValue), strconv.Itoa(rightValue), strconv.Itoa(Multiplication(leftValue, rightValue))
			fmt.Println(strLeftVal + "x" + strRightVal + "=" + strMulti)
		}
	}
}

func MultiplicationTableNum(num int) []int {
	multiNum := []int{}
	for i := 1; i <= num; i++ {
		multiNum = append(multiNum, i)
	}
	return multiNum
}

func Multiplication(x, y int) int {
	return x * y
}

C++: #include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>

using namespace std;

int n;
int tu[55][200];

bool inmap(int x,int y)
{
    if((x>=1&&x<=n)&&(y>=1&&y<=2*x-1)) return true;
    return false;
}

bool check_down(int x,int y,int c,int kind)
{
    if(kind==1)
    {
        /// x+1 --- y,y+1,y+2
        /// x+2 --- y+1,y+2,y+3
        for(int i=0;i<3;i++)
        {
            int nx=x+1,ny=y+i;
            if(inmap(nx,ny))
            {
                if(tu[nx][ny]!=c) return false;
            }
        }
        for(int i=1;i<4;i++)
        {
            int nx=x+2,ny=y+i;
            if(inmap(nx,ny))
            {
                if(tu[nx][ny]!=c) return false;
            }
        }
    }
    else if(kind==0)
    {
        /// x --- y-1 y+1
        /// x+1 --- y+1 y+2 y+3
        /// x+2 -- y+2

        for(int i=-1;i<=1;i++)
        {
            int nx=x,ny=y+i;
            if(inmap(nx,ny))
            {
                if(tu[nx][ny]!=c) return false;
            }
        }

        for(int i=1;i<=3;i++)
        {
            int nx=x+1,ny=y+i;
            if(inmap(nx,ny))
            {
                if(tu[nx][ny]!=c) return false;
            }
        }

        if(inmap(x+2,y+2))
        {
            if(tu[x+2][y+2]!=c) return false;
        }
    }

    return true;
}

bool check_left(int x,int y,int c,int kind)
{
    if(kind==1)
    {
        /// x -- y-1 y-2 y-3
        /// x-1 y-2,y-3,y-4

        for(int i=1;i<=3;i++)
        {
            int nx=x,ny=y-i;
            if(inmap(nx,ny))
            {
                if(tu[nx][ny]!=c) return false;
            }
        }

        for(int i=2;i<=4;i++)
        {
            int nx=x-1,ny=y-i;
            if(inmap(nx,ny))
            {
                if(tu[nx][ny]!=c) return false;
            }
        }
    }
    else if(kind==0)
    {
        /// x -- y-1 y-2
        /// x-1 -- y-1 y-2 y-3 y-4

        for(int i=1;i<=2;i++)
        {
            int nx=x,ny=y-i;
            if(inmap(nx,ny))
            {
                if(tu[nx][ny]!=c) return false;
            }
        }

         for(int i=1;i<=4;i++)
        {
            int nx=x-1,ny=y-i;
            if(inmap(nx,ny))
            {
                if(tu[nx][ny]!=c) return false;
            }
        }
    }

    return true;
}

bool check_right(int x,int y,int c,int kind)
{
    if(kind==1)
    {
        /// x -- y+1 y+2 y+3
        /// x-1 y y+1 y+2 y+3

         for(int i=1;i<=3;i++)
        {
            int nx=x,ny=y+i;
            if(inmap(nx,ny))
            {
                if(tu[nx][ny]!=c) return false;
            }
        }

         for(int i=0;i<=3;i++)
        {
            int nx=x-1,ny=y+i;
            if(inmap(nx,ny))
            {
                if(tu[nx][ny]!=c) return false;
            }
        }

    }
    else if(kind==0)
    {
        /// x y+1 y+2
        /// x-1 y-1 ... y+3
        for(int i=1;i<=2;i++)
        {
            int nx=x,ny=y+i;
            if(inmap(nx,ny))
            {
                if(tu[nx][ny]!=c) return false;
            }
        }
        for(int i=-1;i<=3;i++)
        {
            int nx=x-1,ny=y+i;
            if(inmap(nx,ny))
            {
                if(tu[nx][ny]!=c) return false;
            }
        }
    }
    return true;
}

bool check_heng()
{
	bool flag=true;
	for(int i=1;i<=n&&flag;i++)
	{
		for(int j=1;j<=2*i-1&&flag;j++)
		{
			if(tu[i][j]==0)
			{
				if(inmap(i,j-1)&&tu[i][j-1]==0) continue;
				else flag=false;
			}
		}
	}
	if(flag) return true;
	flag=true;
	for(int i=1;i<=n&&flag;i++)
	{
		for(int j=1;j<=2*i-1&&flag;j++)
		{
			if(tu[i][j]==0)
			{
				if(inmap(i,j+1)&&tu[i][j+1]==0) continue;
				else flag=false;
			}
		}
	}
	if(flag) return true;
	return false;
}

bool check_shu()
{
    bool flag=true;
    for(int i=1;i<=n&&flag;i++)
	{
		for(int j=1;j<=2*i-1&&flag;j++)
		{
			if(tu[i][j]==0)
			{
			    if(j%2==1)
                {
                    int nx=i, ny=j+1;
                    if(inmap(nx,ny)&&tu[nx][ny]==0) ;
                    else flag=false;
                }
                else if(j%2==0)
                {
                    int nx=i-1, ny=j-1;
                    if(inmap(nx,ny)&&tu[nx][ny]==0) ;
                    else flag=false;
                }
			}
		}
	}
	if(flag) return true;
	flag=true;
    for(int i=1;i<=n&&flag;i++)
	{
		for(int j=1;j<=2*i-1&&flag;j++)
		{
			if(tu[i][j]==0)
			{
			    if(j%2==1)
                {
                    int nx=i+1, ny=j+1;
                    if(inmap(nx,ny)&&tu[nx][ny]==0) ;
                    else flag=false;
                }
                else if(j%2==0)
                {
                    int nx=i, ny=j-1;
                    if(inmap(nx,ny)&&tu[nx][ny]==0) ;
                    else flag=false;
                }
			}
		}
	}
	if(flag) return true;
	return false;
}

bool check_xie()
{
    bool flag=true;
    for(int i=1;i<=n&&flag;i++)
	{
		for(int j=1;j<=2*i-1&&flag;j++)
		{
			if(tu[i][j]==0)
			{
			    if(j%2==1)
                {
                    int nx=i, ny=j-1;
                    if(inmap(nx,ny)&&tu[nx][ny]==0) ;
                    else flag=false;
                }
                else if(j%2==0)
                {
                    int nx=i-1, ny=j-1;
                    if(inmap(nx,ny)&&tu[nx][ny]==0) ;
                    else flag=false;
                }
			}
		}
	}
	if(flag) return true;
	flag=true;
    for(int i=1;i<=n&&flag;i++)
	{
		for(int j=1;j<=2*i-1&&flag;j++)
		{
			if(tu[i][j]==0)
			{
			    if(j%2==1)
                {
                    int nx=i+1, ny=j+1;
                    if(inmap(nx,ny)&&tu[nx][ny]==0) ;
                    else flag=false;
                }
                else if(j%2==0)
                {
                    int nx=i, ny=j+1;
                    if(inmap(nx,ny)&&tu[nx][ny]==0) ;
                    else flag=false;
                }
			}
		}
	}
	if(flag) return true;
	return false;
}

char hang[5000];

int main()
{
	int cas=1;
    while(scanf("%d",&n)!=EOF&&n)
    {
    	printf("Puzzle %d\n",cas++);
        for(int i=1;i<=n;i++)
        {
            scanf("%s",hang+1);
            for(int j=1;j<=2*i-1;j++)
            {
                tu[i][j]=hang[j]-'0';
            }
        }
        bool flag=true;

        if(check_heng()||check_shu()||check_xie()){puts("Parts can be separated"); continue;}

        for(int i=1;i<=n&&flag;i++)
        {
        	for(int j=1;j<=2*i-1&&flag;j++)
        	{
        		if(tu[i][j]!=0) continue;
        		if(check_down(i,j,0,j%2)) continue;
        		else flag=false;
        	}
        }

        if(flag==true)
        {
        	puts("Parts can be separated"); continue;
        }

        flag=true;
        for(int i=1;i<=n&&flag;i++)
        {
        	for(int j=1;j<=2*i-1&&flag;j++)
        	{
        		if(tu[i][j]!=0) continue;
        		if(check_left(i,j,0,j%2)) continue;
        		else flag=false;
        	}
        }

        if(flag==true)
        {
        	puts("Parts can be separated"); continue;
        }

        flag=true;
        for(int i=1;i<=n&&flag;i++)
        {
        	for(int j=1;j<=2*i-1&&flag;j++)
        	{
        		if(tu[i][j]!=0) continue;
        		if(check_right(i,j,0,j%2)) continue;
        		else flag=false;
        	}
        }

        if(flag==true)
        {
        	puts("Parts can be separated"); continue;
        }
        else
        {
        	puts("Parts cannot be separated");
        }

    }
    return 0;
}

/**
6
0
001
00011
0000011
000111111
00111111111
5
1
001
00001
0011111
000000111
*/