Go: package main

import "fmt"

func main() {
	//部屋を生成
	var H int

	fmt.Scan(&H)
	room := [][4]bool{}

	for i := 0; i < H; i++ {
		room = append(room, [4]bool{})
	}

	//荷物のおけない区画を設定
	var N int
	fmt.Scan(&N)
	for i := 0; i < N; i++ {
		var x, y int
		fmt.Scan(&x, &y)
		room[y][x] = true //ものがある状態を真とする
	}

	//荷物を配置
	var count int
	for i := 0; i < H-1; i++ {
		for j := 0; j < 3; j++ {
			if !room[i][j] && !room[i+1][j] && !room[i][j+1] && !room[i+1][j+1] {
				room[i][j] = true
				room[i+1][j] = true
				room[i][j+1] = true
				room[i+1][j+1] = true
				count++
			}
		}
	}
	fmt.Println(count)
}

C++: #include <bits/stdc++.h>
using namespace std;
using i64 = long long;
#define rep(i,s,e) for(int (i) = (s);(i) <= (e);(i)++)

int H,W = 4;
int N;
vector<vector<int>> fie;

int main(){
    cin >> H >> N;
    fie.resize(H,vector<int>(W,0));
    rep(i,0,N - 1){
        int x,y;
        cin >> x >> y;
        fie[y][x] = 1;
    }

    int ans = 0;

    rep(i,0,H - 2){
        rep(j,0,W - 2){
            int cou = 0;
            rep(x,i,i + 1){
                rep(y,j,j + 1){
                    cou+= fie[x][y];
                }
            }

            if(cou == 0){
                ans++;
                rep(x,i,i + 1){
                    rep(y,j,j + 1){
                        fie[x][y] = 1;
                    }
                }

            }
        }
    }

    cout << ans << endl;
}

C++: #include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#define ll long long
#define FOR(i,a,b) for(int i=a;i<b;i++)
#define ROF(i,a,b) for(int i=b-1;i>=a;i--)
using namespace std;
//
const int inf=1e9+7;
const int mod=1e9+7;
//
struct poi{
	int X;int Y;int Z;
	bool operator<(const poi&R)const{
		return X==R.X ? Y==R.Y ? Z<R.Z : Y<R.Y : X<R.X;
	}
};
//
ll GCD(ll a,ll b){
	return (b==0)?(a):(GCD(b,a%b));
}
ll LCM(ll a,ll b){
	return a/GCD(a,b)*b;
}
//
int H,N;
int ok[20000][4];
int DP[20000][5];
int main(){
	cin>>H>>N;
	FOR(i,0,H){
		FOR(j,0,4){
			ok[i][j]=1;
		}
	}
	FOR(i,0,N){
		int X,Y;
		cin>>X>>Y;
		ok[Y][X]=0;
	}
	/*
	cout<<endl;
	FOR(i,0,H){
		FOR(j,0,4){
			cout<<ok[i][j]<<" ";
		}
		cout<<endl;
	}
	cout<<endl;
	*/
	//
	if(ok[0][0]&&ok[0][1]&&ok[1][0]&&ok[1][1]){
		DP[0][1]=1;
	}
	if(ok[0][1]&&ok[0][2]&&ok[1][1]&&ok[1][2]){
		DP[0][2]=1;
	}
	if(ok[0][2]&&ok[0][3]&&ok[1][2]&&ok[1][3]){
		DP[0][3]=1;
	}
	if(ok[0][0]&&ok[0][1]&&ok[1][0]&&ok[1][1]&&ok[0][2]&&ok[0][3]&&ok[1][2]&&ok[1][3]){
		DP[0][4]=2;
	}
	//
	if(ok[1][0]&&ok[1][1]&&ok[2][0]&&ok[2][1]){
		DP[1][1]=DP[0][3]+1;
	}
	if(ok[1][1]&&ok[1][2]&&ok[2][1]&&ok[2][2]){
		DP[1][2]=1;
	}
	if(ok[1][2]&&ok[1][3]&&ok[2][2]&&ok[2][3]){
		DP[1][3]=DP[0][1]+1;
	}
	if(ok[1][0]&&ok[1][1]&&ok[2][0]&&ok[2][1]&&ok[1][2]&&ok[1][3]&&ok[2][2]&&ok[2][3]){
		DP[1][4]=2;
	}
	//
	FOR(i,2,H-1){
		DP[i][0]=max({DP[i-2][0],DP[i-2][1],DP[i-2][2],DP[i-2][3],DP[i-2][4],DP[i-1][0],DP[i-1][1],DP[i-1][2],DP[i-1][3],DP[i-1][4]});
		DP[i][1]=max({DP[i-2][0],DP[i-2][1],DP[i-2][2],DP[i-2][3],DP[i-2][4],DP[i-1][3],DP[i-1][0]});
		DP[i][2]=max({DP[i-2][0],DP[i-2][1],DP[i-2][2],DP[i-2][3],DP[i-2][4],DP[i-1][0]});
		DP[i][3]=max({DP[i-2][0],DP[i-2][1],DP[i-2][2],DP[i-2][3],DP[i-2][4],DP[i-1][1],DP[i-1][0]});
		DP[i][4]=max({DP[i-2][0],DP[i-2][1],DP[i-2][2],DP[i-2][3],DP[i-2][4],DP[i-1][0]});
		if(ok[i][0]&&ok[i][1]&&ok[i+1][0]&&ok[i+1][1]){
			DP[i][1]++;
		}else{
			DP[i][1]=max({DP[i][1],DP[i][0]});
		}
		if(ok[i][1]&&ok[i][2]&&ok[i+1][1]&&ok[i+1][2]){
			DP[i][2]++;
		}else{
			DP[i][2]=max({DP[i][2],DP[i][0]});
		}
		if(ok[i][2]&&ok[i][3]&&ok[i+1][2]&&ok[i+1][3]){
			DP[i][3]++;
		}else{
			DP[i][3]=max({DP[i][3],DP[i][0]});
		}
		if(ok[i][0]&&ok[i][1]&&ok[i+1][0]&&ok[i+1][1]&&ok[i][2]&&ok[i][3]&&ok[i+1][2]&&ok[i+1][3]){
			DP[i][4]+=2;
		}else{
			DP[i][4]=max({DP[i][4],DP[i][0]});
		}
	}
	int ans=0;
	/*
	FOR(i,0,H){
		FOR(j,0,5){
			cout<<DP[i][j]<<" ";
		}
		cout<<endl;
	}
	cout<<endl;
	*/
	FOR(i,0,5){
		ans=max(ans,DP[H-2][i]);
	}
	cout<<ans<<endl;
	return 0;
}

C++: //============================================================================
// Name        : AOJ.cpp
// Author      : 
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <algorithm>

using namespace std;

int h,n;
int dp[16][10001]={};
int d[10001]={};

int calc(int i,int m){
	if(dp[i][m]>=0)return dp[i][m];
	dp[i][m]=0;
	for(int j=0;j<16;++j)dp[i][m]=max(dp[i][m],calc(j,m-1));
	if(((3+d[m])==i)&&((3&d[m-1])==0)){
		dp[i][m]=max(dp[i][m],1+calc(0,m-1));
		dp[i][m]=max(dp[i][m],1+calc(4,m-1));
		dp[i][m]=max(dp[i][m],1+calc(8,m-1));
		dp[i][m]=max(dp[i][m],1+calc(12,m-1));
	}
	if(((6+d[m])==i)&&((6&d[m-1])==0)){
		dp[i][m]=max(dp[i][m],1+calc(0,m-1));
		dp[i][m]=max(dp[i][m],1+calc(1,m-1));
		dp[i][m]=max(dp[i][m],1+calc(8,m-1));
		dp[i][m]=max(dp[i][m],1+calc(9,m-1));
	}
	if(((12+d[m])==i)&&((12&d[m-1])==0)){
		dp[i][m]=max(dp[i][m],1+calc(0,m-1));
		dp[i][m]=max(dp[i][m],1+calc(1,m-1));
		dp[i][m]=max(dp[i][m],1+calc(2,m-1));
		dp[i][m]=max(dp[i][m],1+calc(3,m-1));
	}
	if(((15+d[m])==i)&&((6&d[m-1])==0)){
		dp[i][m]=max(dp[i][m],2+calc(0,m-1));
	}
	return dp[i][m];
}
int main() {
	cin>>h>>n;

	for(int i=0;i<10001;++i){
		for(int j=0;j<16;++j){
			dp[j][i]=-1;
		}
	}
	int x,y;
	for(int i=0;i<n;++i){
		cin>>x>>y;
		x=(1<<x);
		for(int j=0;j<16;++j){
			if((j&x)!=x)dp[j][y]=0;
		}
		d[y]+=x;
	}

	for(int j=0;j<16;++j)dp[j][0]=0;


	int total=0;
	for(int i=0;i<16;++i)total=max(total,calc(i,h));
	cout<<total<<endl;
	return 0;
}

C++: #include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<b;i++)
#define rrep(i,a,b) for(int i=a;i>=b;i--)
#define fore(i,a) for(auto &i:a)
#define all(x) (x).begin(),(x).end()
#pragma GCC optimize ("-O3")
using namespace std; void _main(); int main() { cin.tie(0); ios::sync_with_stdio(false); _main(); }
typedef long long ll; const int inf = INT_MAX / 2; const ll infl = 1LL << 60;
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a = b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a = b; return 1; } return 0; }
//---------------------------------------------------------------------------------------------------
/*---------------------------------------------------------------------------------------------------
　　　　　　　　　　　 ∧＿∧  
　　　　　 ∧＿∧ 　（´<_｀ ）　 Welcome to My Coding Space!
　　　　 （ ´_ゝ`）　/　 ⌒i     
　　　　／　　　＼　 　 |　|     
　　　 /　　 /￣￣￣￣/　　|  
　 ＿_(__ﾆつ/　    ＿/ .| .|＿＿＿＿  
　 　　　＼/＿＿＿＿/　（u　⊃  
---------------------------------------------------------------------------------------------------*/






int H, N;
int ng[10101][4];
int dp[10101][1 << 4];
//---------------------------------------------------------------------------------------------------
int check(int y, int msk) {
    rep(x, 0, 4) if (ng[y][x]) if (!(msk & (1 << x))) return 0;
    return 1;
}
//---------------------------------------------------------------------------------------------------
void _main() {
    cin >> H >> N;
    rep(i, 0, N) {
        int x, y; cin >> x >> y;
        ng[y][x] = 1;
    }

    rep(y, 0, H - 1) rep(msk, 0, 1 << 4) if(check(y, msk)) {
        rep(msk2, 0, 1 << 4) if (check(y + 1, msk2)) {
            // 1個置く
            rep(x, 0, 3) {
                if (msk & (1 << x)) continue;
                if (msk & (1 << (x+1))) continue;
                if (msk2 & (1 << x)) continue;
                if (msk2 & (1 << (x + 1))) continue;

                chmax(dp[y + 1][msk2 + (1 << x) + (1 << (x + 1))], dp[y][msk] + 1);
            }
            // 2個置く
            if (msk == 0 and msk2 == 0) chmax(dp[y + 1][(1 << 4) - 1], dp[y][0] + 2);
            chmax(dp[y + 1][msk2], dp[y][msk]);
        }
    }

    int ans = 0;
    rep(msk, 0, 1 << 4) if (check(H - 1, msk)) chmax(ans, dp[H - 1][msk]);
    cout << ans << endl;
}