#include using namespace std; int main() { //输入+输出重定向 freopen("../1349.in", "r", stdin); freopen("../1349.out", "w", stdout); //行15,列10 const int N = 15, M = 10, SIZE = 4; //原有的模块图案 int source[N][M] = {0}; //为了回退加的数组 int tmp[N][M] = {0}; //结果 int target[N][M] = {0}; int blank[N][M] = {0}; //读取初始化数据 for (int i = 0; i < N; i++) { for (int j = 0; j < M; j++) { cin >> source[i][j]; } } //小方块 int small[SIZE][SIZE] = {0}; for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { cin >> small[i][j]; } } //将小方块扩展到大模块图案一样大,即填充0解决 int p; cin >> p; for (int i = 0; i < SIZE; ++i) { for (int j = 0; j < SIZE; ++j) { blank[i][j + p - 1] = small[i][j]; } } //开始错行叠加 for (int i = 0; i < N; i++) { //叠加 for (int i = 0; i < N; ++i) { for (int j = 0; j < M; ++j) { tmp[i][j] = blank[i][j] + source[i][j]; } } //检查 bool success = true; for (int i = 0; i < N; ++i) { for (int j = 0; j < M; ++j) { if (tmp[i][j] > 1) { success = false; break; } } } if (success) { //数组复制出来,可能是最终的解 memcpy(target,tmp,sizeof(target)); //每次错一行 //如果方块的本行和大于0,就不能再继续了~ int sum = 0; for (int j = 0; j < M; ++j) { sum += blank[i][j]; } if (sum > 0) { break; } else { //删除尾行,并且在首行增加一行0 int newBlank[N][M] = {0}; for (int i = 0; i < N - 1; i++) { for (int j = 0; j < M; ++j) { newBlank[i + 1][j] = blank[i][j]; } } //拷贝回去,完成预定目标 memcpy(blank,newBlank,sizeof(blank)); } } else { break; } } //输出结果 for (int i = 0; i < N; ++i) { for (int j = 0; j < M; ++j) { cout << target[i][j] << " "; } cout << endl; } //关闭文件 fclose(stdin); fclose(stdout); return 0; }