AcWing 116. 飞行员兄弟
原题链接
简单
作者:
腾杨天下
,
2021-04-15 23:01:11
,
所有人可见
,
阅读 309
思路
- ①.穷举2^16种情况,在每种情况中,首先将a数组和cnt刷新一遍,用cnt计数操作次数,然后judge一下,如果正确,再看如果cnt比anscnt要小的话,则更新anscnt和ansi,让anscnt=cnt,让ansi=i
- ②.枚举完毕后输出anscnt,换行,然后用一个循环输出ansi中为1的数位/4+1和ansi中为1的数位%4+1
代码
#include<bits/stdc++.h>
using namespace std;
int a[10][10],b[10][10];
int anscnt=1e9;
int ansi;
void turn(int x,int y)
{
if(a[x][y]==1)a[x][y]=0;
else a[x][y]=1;
}
bool judge(void)
{
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(a[i][j]==0)return false;
}
}
return true;
}
void turnall(int x,int y)
{
for(int i=0;i<4;i++)
{
turn(x,i);
turn(i,y);
}
turn(x,y);
}
int main()
{
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
char c;
cin>>c;
if(c=='-')a[i][j]=1;
else a[i][j]=0;
b[i][j]=a[i][j];
}
}
for(int i=1;i<(1<<16);i++)
{
memcpy(a,b,sizeof b);
int cnt=0;
for(int j=0;j<16;j++)
{
if(i>>j&1)
{
turnall(j/4,j%4);
cnt++;
}
}
if(judge())
{
if(cnt<anscnt)
{
anscnt=cnt;
ansi=i;
}
}
}
cout<<anscnt<<endl;
for(int i=0;i<16;i++)
{
if(ansi>>i&1)
{
cout<<i/4+1<<' '<<i%4+1<<endl;
}
}
return 0;
}