这段时间要沉迷刷题一段时间了,就让CSDN陪我一起吧!
一、题目大意
题目的大致意思是,给定一个n×m的元素为0或1的矩阵A,还有一个同样大小的矩阵B,B的元素均为0,然后可以对B进行一种操作:在B中选定一个坐标 i, j,然后把 (i, j)、(i+1, j)、(i, j+1)、(i+1, j+1)这四个元素赋值为1,问经过什么样的操作才能使B矩阵与A矩阵一样。这里注意,不要求所进行的操作数量最小。
二、题目思路以及AC代码
这题应该就是比较简单的实现题。就是暴力求解,可能代码上需要注意一些小问题。
说一个我第一次WA的问题,就是写代码时一不小心在内循环中也写成n了,它是n×m的矩阵,需要注意,其他就没有什么了。
下面给出AC代码:
#include <iostream>
#include <vector>
#define MAXN 55
using namespace std;
int n, m;
int A[MAXN][MAXN];
bool vis[MAXN][MAXN];
int di[4][3] = {{-1, -1, 0}, {0, -1, -1}, {0, 1, 1}, {0, 1, 1}};
int dj[4][3] = {{-1, 0, -1}, {1, 0, 1}, {-1, -1, 0}, {1, 0, 1}};
vector<pair<int, int>> res;
void init() {
res.clear();
for (int i=1;i<=n;i++) {
for (int j=1;j<=m;j++) {
vis[i][j] = false;
}
}
}
pair<int, int> check(int x, int y) {
pair<int, int> ans;
int flag;
for (int i=0;i<4;i++) {
flag = 0;
for (int j=0;j<3;j++) {
int nx = x + di[i][j];
int ny = y + dj[i][j];
if (nx<=0 || nx>n || ny<=0 || ny>m) continue;
if (!A[nx][ny]) break;
flag++;
}
if (flag == 3) {
switch (i){
case 0: return make_pair(x-1, y-1);
case 1: return make_pair(x-1, y);
case 2: return make_pair(x, y-1);
case 3: return make_pair(x, y);
}
}
}
return make_pair(-1, -1);
}
int main() {
cin >> n >> m;
init();
for (int i=1;i<=n;i++) {
for (int j=1;j<=m;j++) {
cin >> A[i][j];
}
}
bool flag = true;
for (int i=1;i<=n && flag;i++) {
for (int j=1;j<=m && flag;j++) {
if (!A[i][j]) continue;
pair<int, int> p = check(i, j);
if (p.first == -1 && p.second == -1) flag = false;
else {
int ri = p.first;
int rj = p.second;
if (!vis[ri][rj]) {
res.push_back(make_pair(ri, rj));
vis[ri][rj] = true;
}
}
}
}
if (!flag) cout << -1 << endl;
else {
int size = res.size();
cout << size << endl;
for (int i=0;i<size;i++) {
cout << res[i].first << " " << res[i].second << endl;
}
}
// system("pause");
return 0;
}
如果有问题,欢迎大家指正!!!