Codeforces Round #676 (Div. 2) B

B. Putting Bricks in the Wall

原题链接

题面

Pink Floyd are pulling a prank on Roger Waters. They know he doesn’t like walls, he wants to be able to walk freely, so they are blocking him from exiting his room which can be seen as a grid.

Roger Waters has a square grid of size n×n and he wants to traverse his grid from the upper left (1,1) corner to the lower right corner (n,n). Waters can move from a square to any other square adjacent by a side, as long as he is still in the grid. Also except for the cells (1,1) and (n,n) every cell has a value 0 or 1 in it.

Before starting his traversal he will pick either a 0 or a 1 and will be able to only go to cells values in which are equal to the digit he chose. The starting and finishing cells (1,1) and (n,n) are exempt from this rule, he may go through them regardless of picked digit. Because of this the cell (1,1) takes value the letter ‘S’ and the cell (n,n) takes value the letter ‘F’.

For example, in the first example test case, he can go from (1,1) to (n,n) by using the zeroes on this path: (1,1), (2,1), (2,2), (2,3), (3,3), (3,4), (4,4)

The rest of the band (Pink Floyd) wants Waters to not be able to do his traversal, so while he is not looking they will invert at most two cells in the grid (from 0 to 1 or vice versa). They are afraid they will not be quick enough and asked for your help in choosing the cells. Note that you cannot invert cells (1,1) and (n,n).

We can show that there always exists a solution for the given constraints.

Also note that Waters will pick his digit of the traversal after the band has changed his grid, so he must not be able to reach (n,n) no matter what digit he picks.

Input

Each test contains multiple test cases. The first line contains the number of test cases t (1≤t≤50). Description of the test cases follows.

The first line of each test case contains one integers n (3≤n≤200).

The following n lines of each test case contain the binary grid, square (1,1) being colored in ‘S’ and square (n,n) being colored in ‘F’.

The sum of values of n doesn’t exceed 200.

Output

For each test case output on the first line an integer c (0≤c≤2) — the number of inverted cells.

In i-th of the following c lines, print the coordinates of the i-th cell you inverted. You may not invert the same cell twice. Note that you cannot invert cells (1,1) and (n,n).

Example

Input

3
4
S010
0001
1000
111F
3
S10
101
01F
5
S0101
00000
01111
11111
0001F

Output

1
3 4
2
1 2
2 1
0

Note

For the first test case, after inverting the cell, we get the following grid:

S010
0001
1001
111F

题意

W要从起点S走到终点F,每个方格(除起点终点)上都有0或1,W从0或1中选择一个数,选中之后,只能通过该数才能前进,要求我们改变0~2个方格,是方格上的数字倒置,使得W不论选择什么都无法到达终点

思路

因为起点和终点的位置始终不变,那么从起点出发时必然要经过(1,2)或(2,1),到达终点是也必然要经过(n,n-1)或(n-1,n),只要我们能够保证起点周围的两点一定不和终点周围的两点相同,则W永远不会到达终点

代码如下

#include <iostream>
 
using namespace std;
 
const int N = 210;
char map[N][N];
 
int main(void)
{
    int t;
    cin >> t;
    while(t--)
    {
        int n;
        cin >> n;
        for(int i=0;i<n;i++)cin >> map[i];
        
        int s1 = 0,s0 = 0,f1 = 0,f0 = 0;
        
        if(map[0][1] == '1')s1++;
        else s0++;
        
        if(map[1][0] == '1')s1++;
        else s0++;
        
        if(map[n-1][n-2] == '1')f1++;
        else f0++;
        
        if(map[n-2][n-1] == '1')f1++;
        else f0++;
        
        if((s1==0&&f1==2)||(s1==2&&f1==0))cout << "0" << endl;
        else if((s1==0&&f1==0)||(s1==2&&f1==2)){
            cout << "2" << endl;
            cout << "1" << " " << "2" << endl;
            cout << "2" << " " << "1" << endl;
        }else if(s1==1&&f1==1){
            cout << "2" << endl;
            if(map[0][1]==map[n-1][n-2]){
                cout << n << " " << n-1 << endl;
                cout << "2" << " " << "1" << endl;
            }else {
                cout << n << " " << n-1 << endl;
                cout << "1" << " " << "2" << endl;
            }
        }else if((s1==0&&f1==1)||(s1==2&&f1==1)){
            cout << "1" << endl;
            if(map[n-1][n-2]==map[0][1])cout << n << " " << n-1 << endl;
            else cout << n-1 << " " << n << endl;
        }else if((s1==1&&f1==0)||(s1==1&&f1==2)){
            cout << "1" << endl;
            if(map[1][0]==map[n-1][n-2])cout << "2" << " " << "1" << endl;
            else cout << "1" << " " << "2" << endl;
        }
        
    }
    
    return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值