include[HTML_REMOVED]
include[HTML_REMOVED]
include[HTML_REMOVED]
include[HTML_REMOVED]
using namespace std;
const int N = 5;
int dx[N] = {1,0,-1,0,0};
int dy[N] = {0,1,0,-1,0};
char g[N][N];
char backup[N][N];
void turn(int x, int y)
{
for(int i = 0; i < 5; i++)
{
int a = x + dx[i]; int b = y + dy[i];
if(a<0||a>4||b<0||b>4)
continue;
g[a][b] ^=1;//注意点1
}
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int list = 25;
for(int i = 0; i < 5; i++)
{
cin>>g[i];
}
memcpy(backup,g,sizeof g);
for(int j = 0; j < 32; j++)
{
memcpy(g,backup,sizeof g);
int step = 0;
for(int i = 0; i < 5; i++)
{
if((j>>i)&1)//注意点二
{
turn(0,4-i);
step++;
}
}
for(int i = 1; i < 5; i++)
{
for(int j = 0; j < 5; j++)
{
if(g[i-1][j] == '0')
{
turn(i,j);
step++;
}
}
}
int success = 1;
for(int i = 0; i < 5; i++)
{
if(g[4][i]=='0')
{
success = 0;
break;
}
}
if(success==0)
{
step = 25;
}
list = min(list,step);
}
if(list > 6)
{
printf("-1\n");
}
else
{
printf("%d\n",list);
}
//printf("%d\n",list);
}
return 0;
}
代码与第一位大佬写的代码差不多,但这里我想补充两处(已在代码中标注了),我当时是以初学者的身份做这一题,对于那两处是有疑问的,而且好不容易弄懂了,所以想提一下。
g[a][b] ^=1;//注意点1
这里的作用是将字符‘1’转化为字符‘0’,或者反过来。假如我写一个偶数,对应的二进制数为1001010(只要保证最后一位是0就是偶数),该数与1异或,仅仅最后一位改变,其大小加一了。如‘0’对应的ASCII为48,加一为49,49对应的字符为‘1’,其他的都同理。总之注意要字符与二进制数相互转换就行了。