最近在找工作,记录一下自己的解题思路,以便之后翻阅以及优化。
题目:输入行列数,1表示有人,0表示没人,要使得所有有人的位置上下左右都没有人,求给出的数组还能再多放置几个人?
思路一:(不完善)求数组中,为0的位置上下左右的人数之和(即看没人的位置,上下左右是否有人),可以得到另一个同行列的数组。在这个数组的基础上,求每行的0个数(0代表上下左右都没有人),单个0表示此位置可以放人,两个连续的0表示可以放一个人,三个连续的0表示可以放两个人,四个连续的0也只能放两个人。即放置的人个数x为(i+1)/2,i为连续0个数。代码如下:
#include<iostream>
#include<vector>
using namespace std;
int sumzero1(vector<int>&v){//求连续一个0个数
int ans = 0;
for (int i = 0; i < v.size(); i++){
if (v[i] == 0){
if (i == 0){
if (v[i + 1] != 0)ans++;
}
else if (i == v.size() - 1){
if (v[i - 1] != 0)ans++;
}
else{
if (v[i - 1] != 0 && v[i + 1] != 0)ans++;
}
}
}
return ans;
}
int sumzero2(vector<int>&v){//求连续二个0个数
int ans = 0;
for (int i = 0; i < v.size()-1; i++){
if (v[i] == 0){
if (i == 0){
if (v[i + 1] == 0&&v[i + 2] != 0)ans++;
}
else if (i == v.size() - 2){
if (v[i - 1] != 0 && v[i + 1] == 0)ans++;
}
else{
if (v[i - 1] != 0 && v[i + 1] == 0 && v[i +2] != 0)ans++;
}
}
}
return ans;
}
int sumzero3(vector<int>&v){//求连续三个0个数
int ans = 0;
for (int i = 0; i < v.size()-2; i++){
if (v[i] == 0){
if (i == 0){
if (v[i + 1] == 0 && v[i + 2] == 0 && v[i + 3] != 0)a