针对七巧板问题,设计存储形式,编程序完成涂色设计,用C语言编写
时间: 2023-11-29 11:03:44 浏览: 93
针对七巧板问题的存储形式可以使用一个二维数组,数组中的每个元素表示七巧板中的一个小方块是否被涂色,例如,可以使用0表示未涂色,1表示已涂色。
编程过程中,可以先定义一个二维数组来存储七巧板的状态,然后根据题目要求对其进行涂色。具体的涂色方式可以通过递归函数实现,每次递归分别对七巧板的每个小方块进行遍历,若该方块未被涂色,则尝试将其涂上颜色,并继续递归涂色相邻的方块,如果涂色成功,则返回true,否则回溯到上一步继续寻找其他涂色方案。
下面是一个用C语言实现的七巧板涂色程序:
```c
#include <stdio.h>
#include <stdbool.h>
#define ROW 5
#define COL 4
int board[ROW][COL];
int pieces[7][4][2] = {
{{0, 0}, {0, 1}, {0, 2}, {1, 1}},
{{0, 0}, {0, 1}, {1, 0}, {2, 0}},
{{0, 0}, {0, 1}, {1, 1}, {1, 2}},
{{0, 0}, {0, 1}, {0, 2}, {1, 2}},
{{0, 1}, {1, 0}, {1, 1}, {2, 0}},
{{0, 1}, {1, 0}, {1, 1}, {1, 2}},
{{0, 0}, {1, 0}, {1, 1}, {2, 1}}
};
bool fill_board(int piece_num) {
int i, j, k, row, col;
bool flag = true;
for (i = 0; i < 4; i++) {
row = pieces[piece_num][i][0];
col = pieces[piece_num][i][1];
if (board[row][col] == 1) {
flag = false;
break;
}
}
if (flag) {
for (i = 0; i < 4; i++) {
row = pieces[piece_num][i][0];
col = pieces[piece_num][i][1];
board[row][col] = 1;
}
if (piece_num == 6) {
return true;
}
for (j = 0; j < ROW; j++) {
for (k = 0; k < COL; k++) {
if (board[j][k] == 0) {
if (fill_board(piece_num + 1)) {
return true;
}
}
}
}
for (i = 0; i < 4; i++) {
row = pieces[piece_num][i][0];
col = pieces[piece_num][i][1];
board[row][col] = 0;
}
}
return false;
}
int main() {
int i, j;
bool result;
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
board[i][j] = 0;
}
}
result = fill_board(0);
if (result) {
for (i = 0; i < ROW; i++) {
for (j = 0; j < COL; j++) {
printf("%d ", board[i][j]);
}
printf("\n");
}
}
else {
printf("No solution.\n");
}
return 0;
}
```
在上述代码中,fill_board函数实现了涂色的递归过程,piece_num参数表示当前要涂色的七巧板块的编号,flag变量表示当前七巧板块是否可以涂色,如果可以涂色,则将其涂上颜色,并尝试涂色下一个七巧板块,如果全部七巧板块都已经涂色,则返回true,表示已经找到了一种可行的涂色方案。
在主函数中,先将七巧板的状态初始化为未涂色,然后调用fill_board函数来寻找可行的涂色方案。如果找到了可行方案,则输出涂色结果,否则输出"No solution."。
阅读全文