C ++ 5.806字节
尚未针对大小进行优化。但由于参赛者很少,我现在将其保留。
农民字段标题:
#pragma once
namespace FarmersLand
{
class FarmersField
{
private:
unsigned _m_size, _n_size;
int * _lamp, * _lumination;
char * _buffer;
void _illuminate(unsigned m, unsigned n);
void _deluminate(unsigned m, unsigned n);
void _removeLamp(unsigned m, unsigned n);
void _setLamp(unsigned m, unsigned n);
int _canRemoveLamp(unsigned m, unsigned n);
int _coordsAreValid(unsigned m, unsigned n);
int _getLuminationLevel(unsigned m, unsigned n);
int * _allocIntArray(unsigned m, unsigned n);
int _coordHelper(unsigned m, unsigned n);
public:
FarmersField(char * input[]);
FarmersField(const FarmersField & field);
~FarmersField(void);
int RemoveLamps(void);
char * Cstr(void);
};
}
农民田间CPP:
#include "FarmersField.h"
#include <stdio.h>
namespace FarmersLand
{
void FarmersField::_illuminate(unsigned m, unsigned n)
{
if(this -> _coordsAreValid(m,n))
{
++this -> _lumination[this -> _coordHelper(m,n)];
}
}
void FarmersField::_deluminate(unsigned m, unsigned n)
{
if(this -> _coordsAreValid(m,n))
{
--this -> _lumination[this -> _coordHelper(m,n)];
}
}
void FarmersField::_removeLamp(unsigned m, unsigned n)
{
if(this -> _coordsAreValid(m,n))
{
unsigned mi_start = (m == 0) ? 0 : m - 1;
unsigned mi_end = m + 1;
unsigned ni_start = (n == 0) ? 0 : n - 1;
unsigned ni_end = n + 1;
for(unsigned mi = mi_start; mi <= mi_end; ++mi)
{
for(unsigned ni = ni_start; ni <= ni_end; ++ni)
{
this -> _deluminate(mi, ni);
}
}
--this -> _lamp[this -> _coordHelper(m,n)];
}
}
void FarmersField::_setLamp(unsigned m, unsigned n)
{
if(this -> _coordsAreValid(m,n))
{
unsigned mi_start = (m == 0) ? 0 : m - 1;
unsigned mi_end = m + 1;
unsigned ni_start = (n == 0) ? 0 : n - 1;
unsigned ni_end = n + 1;
for(unsigned mi = mi_start; mi <= mi_end; ++mi)
{
for(unsigned ni = ni_start; ni <= ni_end; ++ni)
{
this -> _illuminate(mi, ni);
}
}
++this -> _lamp[this -> _coordHelper(m,n)];
}
}
int FarmersField::_canRemoveLamp(unsigned m, unsigned n)
{
unsigned can = 1;
unsigned mi_start = (m == 0) ? 0 : m - 1;
unsigned mi_end = (m == (this->_m_size - 1)) ? m : m + 1;
unsigned ni_start = (n == 0) ? 0 : n - 1;
unsigned ni_end = (n == (this->_n_size - 1)) ? n : n + 1;
for(unsigned mi = mi_start; mi <= mi_end; ++mi)
{
for(unsigned ni = ni_start; ni <= ni_end; ++ni)
{
if( 1 >= this -> _getLuminationLevel(mi, ni) )
{
can = 0;
}
}
}
return can;
}
int FarmersField::_coordsAreValid(unsigned m, unsigned n)
{
return m < this -> _m_size && n < this -> _n_size;
}
int FarmersField::_getLuminationLevel(unsigned m, unsigned n)
{
if(this -> _coordsAreValid(m,n))
{
return this -> _lumination[this -> _coordHelper(m,n)];
}
else
{
return 0;
}
}
int * FarmersField::_allocIntArray(unsigned m, unsigned n)
{
int * a = new int[m * n];
for(unsigned i = 0; i < m*n; ++i)
{
a[i] = 0;
}
return a;
}
int FarmersField::_coordHelper(unsigned m, unsigned n)
{
return m * this -> _n_size + n;
}
int FarmersField::RemoveLamps(void)
{
int r = 0;
for(unsigned m = 0 ; m < this -> _m_size; ++m)
{
for(unsigned n = 0 ; n < this -> _n_size; ++n)
{
if(this -> _canRemoveLamp(m,n))
{
++r;
this -> _removeLamp(m,n);
}
}
}
return r;
}
char * FarmersField::Cstr(void)
{
unsigned size = this -> _m_size * this -> _n_size + _m_size ;
unsigned target = 0;
delete(this -> _buffer);
this -> _buffer = new char[ size ];
for(unsigned m = 0 ; m < this -> _m_size; ++m)
{
for(unsigned n = 0 ; n < this -> _n_size; ++n)
{
this -> _buffer[target++] = (0 == this -> _lamp[this -> _coordHelper(m,n)])? '0' : '1';
}
this -> _buffer[target++] = '-';
}
this -> _buffer[size - 1 ] = 0;
return this -> _buffer;
}
FarmersField::FarmersField(char * input[])
{
sscanf_s(input[0], "%u %u", &this -> _m_size, &this -> _n_size);
this -> _lamp = this -> _allocIntArray(this -> _m_size, this -> _n_size);
this -> _lumination = this -> _allocIntArray(this -> _m_size, this -> _n_size);
this -> _buffer = new char[1];
for(unsigned m = 0 ; m < this -> _m_size; ++m)
{
for(unsigned n = 0 ; n < this -> _n_size; ++n)
{
if('0' != input[m+1][n])
{
this -> _setLamp(m,n);
}
}
}
}
FarmersField::FarmersField(const FarmersField & field)
{
this -> _m_size = field._m_size;
this -> _n_size = field._n_size;
this -> _lamp = this -> _allocIntArray(this -> _m_size, this -> _n_size);
this -> _lumination = this -> _allocIntArray(this -> _m_size, this -> _n_size);
this -> _buffer = new char[1];
for(unsigned m = 0 ; m < this -> _m_size; ++m)
{
for(unsigned n = 0 ; n < this -> _n_size; ++n)
{
if(0 != field._lamp[this -> _coordHelper(m,n)])
{
this -> _setLamp(m,n);
}
}
}
}
FarmersField::~FarmersField(void)
{
delete(this -> _lamp);
delete(this -> _lumination);
delete(this -> _buffer);
}
}
并进行了一系列测试,以证明该代码能够完成其构建工作:
#include "../../Utility/GTest/gtest.h"
#include "FarmersField.h"
TEST(FarmersField, Example1)
{
using namespace FarmersLand;
char * input[] = {"3 3", "100", "010", "001"};
FarmersField f(input);
EXPECT_STREQ("100-010-001", f.Cstr());
EXPECT_EQ(2, f.RemoveLamps());
EXPECT_STREQ("000-010-000", f.Cstr());
}
TEST(FarmersField, Example2)
{
using namespace FarmersLand;
char * input[] = {"3 6", "100000", "010000", "001000"};
FarmersField f(input);
EXPECT_STREQ("100000-010000-001000", f.Cstr());
EXPECT_EQ(1, f.RemoveLamps());
EXPECT_STREQ("000000-010000-001000", f.Cstr());
}
TEST(FarmersField, Example3)
{
using namespace FarmersLand;
char * input[] = {"6 3", "100", "010", "001", "000", "000", "000",};
FarmersField f(input);
EXPECT_STREQ("100-010-001-000-000-000", f.Cstr());
EXPECT_EQ(1, f.RemoveLamps());
EXPECT_STREQ("000-010-001-000-000-000", f.Cstr());
}
TEST(FarmersField, Example4)
{
using namespace FarmersLand;
char * input[] = {"3 3", "000", "000", "000",};
FarmersField f(input);
EXPECT_STREQ("000-000-000", f.Cstr());
EXPECT_EQ(0, f.RemoveLamps());
EXPECT_STREQ("000-000-000", f.Cstr());
}
TEST(FarmersField, Example5)
{
using namespace FarmersLand;
char * input[] = {"3 3", "111", "111", "111",};
FarmersField f(input);
EXPECT_STREQ("111-111-111", f.Cstr());
EXPECT_EQ(8, f.RemoveLamps());
EXPECT_STREQ("000-010-000", f.Cstr());
}
TEST(FarmersField, Example6)
{
using namespace FarmersLand;
char * input[] = {"6 6", "100001", "001010", "001001", "001010", "110000", "100001",};
FarmersField f(input);
EXPECT_STREQ("100001-001010-001001-001010-110000-100001", f.Cstr());
EXPECT_EQ(6, f.RemoveLamps());
EXPECT_STREQ("100011-001010-000000-000010-010000-000001", f.Cstr());
}