116. 飞行员兄弟
直接暴力枚举所有状态,时间复杂度:\(O(2^{16} \times 4^3)\)
const int N=5;
bool g[N][N],tmp[N][N];
int n=4,m=4;
bool check(int x,int y)
{
return x>=0 && x<n && y>=0 && y<m;
}
void change(int x,int y)
{
for(int i=0;i<n;i++) tmp[i][y]^=1;
for(int i=0;i<m;i++) tmp[x][i]^=1;
tmp[x][y]^=1;
}
int get(int x,int y)
{
return x*n+y;
}
int main()
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
char c;
cin>>c;
if(c == '-') g[i][j]=1;
else g[i][j]=0;
}
vector<PII> ans;
for(int s=0;s<(1<<16);s++)
{
memcpy(tmp,g,sizeof g);
vector<PII> res;
int cnt=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if(s>>get(i,j) & 1)
{
change(i,j);
res.pb({i,j});
}
bool ok=true;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
if(!tmp[i][j])
{
ok=false;
break;
}
if(!ok) break;
}
if(ok && (ans.size() == 0 || ans.size() > res.size()))
ans=res;
}
cout<<ans.size()<<endl;
for(int i=0;i<ans.size();i++)
cout<<ans[i].fi+1<<' '<<ans[i].se+1<<endl;
//system("pause");
return 0;
}