本题最直接的做法就是将整个4*4的板块放入15*10的地图中依次进行位移模拟,但是这样会存在许多不必要的计算而且会加大代码量。不过可以这个思想仍然可以借鉴。那就是将板块中各个方块(即值为1)在板块中的坐标(根据题意坐标数目必为4)给记录下来。用提取的坐标进行模拟。
具体代码如下:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
//FILE *stream;
//freopen_s(&stream, "data.txt", "r", stdin);
vector<vector<int>> map(15); //存储15*10的地图
for(int i = 0; i < 15; i++)
{
for(int j = 0; j < 10; j++)
{
int temp;
cin >> temp;
map[i].push_back(temp);
}
}
vector<pair<int, int>> coor; //存储方块在4*4板块中的坐标
int deep; //记录方块在板块中的最深坐标用来控制循环
for(int i = 0; i < 4; i++)
{
for(int j = 0; j < 4; j++)
{
int temp;
cin >> temp;
if(temp) { coor.push_back({i, j}); deep = i; }
}
}
int x, y; //检验地图中的坐标
cin >> y;
y--; //由于输入的坐标是从1开始故需要自减
for(x = 0; x + deep < 15; x++)
{
int check = 0;
for(int i = 0; i < 4; i++)
check |= map[x + coor[i].first][y + coor[i].second];
if(check) break; //check非零说明已经发生了碰撞,故退出循环
}
x--; //x恢复到碰撞前的坐标
for(int i = 0; i < 4; i++) //由坐标修改地图
map[x + coor[i].first][y + coor[i].second] = 1;
for(int i = 0; i < 15; i++)
{
for(int j = 0; j < 10; j++)
cout << map[i][j] << ' ';
cout << endl;
}
//fclose(stream);
return 0;
}