七巧板程序设计

七巧板是我国民间流传的一种拼图游戏,制作简单但变化多端,具有很高的益智价值。七巧板制作非常简单,使用一张正方形的厚纸板按图13-6所示图样裁开即可。本程序在计算机上模拟使用七巧板进行拼图。
 
CRgn类用来表示一个区域,其形状不限于矩形。
CRgn类有许多成员函数,其中较重要的有:
1.建立区域:
BOOL CreateRectRgn( int x1, int y1, int x2, int y2 );
BOOL CreateRectRgnIndirect( LPCRECT lpRect );
BOOL CreateEllipticRgn( int x1, int y1, int x2, int y2 );
BOOL CreateEllipticRgnIndirect( LPCRECT lpRect );
BOOL CreatePolygonRgn( LPPOINT lpPoints, int nCount, int nMode );
这几个成员函数分别用于建立矩形、椭圆和多边形区域。对于矩形和椭圆区域要求给出矩形(或椭圆的包含矩形)的参数;对多边形区域,除要求给出多边形的各顶点坐标和顶点个数外,还应说明多边形区域的填充方式。参数nMode可选ALTERNATE 或 WINDING值。如果建立区域成功,返回非零值,否则返回零。

2.取区域的包含矩形
int GetRgnBox ( LPRECT lpRect ) const;

3.移动区域
int OffsetRgn( int x, int y );
int OffsetRgn( POINT point );
该函数可移动一个区域,参数x,y或point为偏移量。

4.测试给定坐标点是否在区域中
BOOL PtInRegion( int x, int y ) const;
BOOL PtInRegion( POINT point ) const;
该函数用来测试一给定坐标点是否在区域中。若在,则返回非零值,否则返回零。

5.测试给定矩形是否在区域中
BOOL RectInRegion( LPCRECT lpRect ) const;

程序:

针对七巧板问题,可以采用一个二维数组来存储七巧板的形状,其中1表示该位置需要被涂色,0表示该位置不需要被涂色。例如,可以用以下方式存储七巧板的形状: ``` board = [ [0, 0, 1, 1, 0, 0], [0, 1, 1, 1, 1, 0], [1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1], [0, 1, 1, 1, 1, 0], [0, 0, 1, 1, 0, 0] ] ``` 然后,可以编写一个递归函数来完成七巧板的涂色设计。函数的参数包括当前需要涂色的方格位置、当前已经涂过色的方格数量、以及已经涂色的颜色列表。具体实现如下: ``` colors = ['red', 'blue', 'green', 'yellow'] def paint(board, row, col, count, used_colors): if count == sum(sum(board)): return True for color in colors: if color in used_colors: continue if (row > 0 and board[row-1][col]) or \ (col > 0 and board[row][col-1]) or \ (row < len(board)-1 and board[row+1][col]) or \ (col < len(board[0])-1 and board[row][col+1]): continue board[row][col] = color if paint(board, row, col+1, count+1, used_colors.union(set([color]))): return True if paint(board, row+1, col, count+1, used_colors.union(set([color]))): return True if paint(board, row, col-1, count+1, used_colors.union(set([color]))): return True if paint(board, row-1, col, count+1, used_colors.union(set([color]))): return True board[row][col] = 0 return False paint(board, 0, 0, 0, set()) ``` 在上述代码中,我们首先定义了颜色列表colors,然后定义了递归函数paint,该函数的参数包括需要涂色的方格位置(row, col)、已经涂过色的方格数量count、以及已经涂色的颜色列表used_colors。在函数中,我们首先判断是否已经将所有方格都涂过色,如果是,则返回True。否则,我们枚举所有可以使用的颜色,如果该颜色已经被使用过,则跳过该颜色。接着,我们判断当前位置是否可以使用该颜色,如果不行,则跳过该颜色。如果可以使用该颜色,则将该颜色涂在当前位置,并继续递归调用paint函数,分别尝试涂色当前位置的右、下、左、上四个方向。如果某个方向成功涂色,则返回True。如果所有方向都不能成功涂色,则将当前位置的颜色清除,并返回False。 最后,我们调用paint函数,以左上角的方格作为起始点开始尝试涂色。如果成功涂色,则七巧板被涂色完成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值