B Putting Bricks in the Wall
https://codeforces.com/contest/1421/problem/B
题意:平克·弗洛伊德跟罗杰·沃特斯开玩笑,他们知道沃特斯不喜欢墙壁,他希望能够自由行走,所以他们阻止他离开他的房间,这个房间可以看作是一个 n×n 的正方形网格,他希望从左上角(1,1)到右下角(n,n)遍历网格。只要沃特斯还在网格中,他就可以从一个正方形移动到另一个相邻的正方形。除单元格(1,1)和(n,n)外,每个单元格都有一个值 0或1。在开始遍历之前,沃特斯将选择0或1,并且只能走到与他选择的数字相等的单元格值。起始和结束单元格(1,1)和(n,n)不受此规则约束,他可以遍历它们,而不考虑选取的数字。因此,单元格(1,1)取值字母“S”,单元格(n,n)取值字母“F”。
平克·弗洛伊德希望沃特斯不能离开他的房间,所以当沃特斯不注意的时候,他最多能在网格中反转两个单元格(把0变成1,或把1变成0)来阻止沃特斯离开房间,但不能反转单元格(1,1)和(n,n)。
输出:修改格子数量以及修改的格子位置。
做法:可以从他必经与S 、F相邻的格子[1,2] [2,1] [n,n-1] [n-1,n]入手,使 S 相邻格子和 F 相邻格子数值不一样即可达成目的,用条件语句判断所有情况。
AC代码:
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
char gr[215][215];
void solve(int n)
{
for(int i = 1; i <= n; i++)
cin>>gr[i] + 1;
int a = gr[1][2] - '0', b = gr[2][1] - '0',
c = gr[n-1][n] - '0', d = gr[n][n-1] - '0';
if(a == b)
{
if(c == d)
{
if(a != c)
{
cout<<0<<endl;
}
else
{
cout<<2<<endl;
cout<<1<<" "<<2<<endl;
cout<<2<<" "<<1<<endl;
}
}
if(c != d)
{
cout<<1<<endl;
if(a == c)
cout<<n-1<<" "<<n<<endl;
else
cout<<n<<" "<<n-1<<endl;
}
}
else
{
if(c == d)
{
cout<<1<<endl;
if(a != c)
cout<<2<<" "<<1<<endl;
else
cout<<1<<" "<<2<<endl;
}
else
{
cout<<2<<endl;
if(a != c)
{
cout<<2<<" "<<1<<endl;
cout<<n<<" "<<n-1<<endl;
}
else
{
cout<<2<<" "<<1<<endl;
cout<<n-1<<" "<<n<<endl;
}
}
}
}
int main()
{
int n, T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
memset(gr,0,sizeof(gr));
solve(n);
}
return 0;
}