Codeforces #663 (Div. 2) B. Fix You(思维水题)

B. Fix You(思维水题)

原题链接:https://codeforces.com/contest/1391/problem/B

time limit per test:1 second
memory limit per test:256 megabytes
input:standard input
output:standard output

Consider a conveyor belt represented using a grid consisting of n rows and m columns. The cell in the i − t h i^{-th} ith row from the top and the j − t h j^{-th} jth column from the left is labelled ( i , j ) (i,j) (i,j).

Every cell, except ( n , m ) (n,m) (n,m), has a direction R ( R i g h t ) R (Right) R(Right) or D ( D o w n ) D (Down) D(Down) assigned to it. If the cell ( i , j ) (i,j) (i,j) is assigned direction R R R, any luggage kept on that will move to the cell ( i , j + 1 ) (i,j+1) (i,j+1). Similarly, if the cell ( i , j ) (i,j) (i,j) is assigned direction D D D, any luggage kept on that will move to the cell ( i + 1 , j ) (i+1,j) (i+1,j). If at any moment, the luggage moves out of the grid, it is considered to be lost.

There is a counter at the cell ( n , m ) (n,m) (n,m) from where all luggage is picked. A conveyor belt is called functional if and only if any luggage reaches the counter regardless of which cell it is placed in initially. More formally, for every cell ( i , j ) (i,j) (i,j), any luggage placed in this cell should eventually end up in the cell ( n , m ) (n,m) (n,m).

This may not hold initially; you are, however, allowed to change the directions of some cells to make the conveyor belt functional. Please determine the minimum amount of cells you have to change.

Please note that it is always possible to make any conveyor belt functional by changing the directions of some set of cells.

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

The first line of each test case contains two integers n , m n,m n,m ( 1 ≤ n ≤ 100 , 1 ≤ m ≤ 100 ) (1≤n≤100, 1≤m≤100) (1n100,1m100) — the number of rows and columns, respectively.

The following n lines each contain m characters. The j − t h j^{-th} jth character in the i − t h i^{-th} ith line, a i , j a_{i,j} ai,j is the initial direction of the cell (i,j). Please note that a n , m a_{n,m} an,m= C C C.

Output
For each case, output in a new line the minimum number of cells that you have to change to make the conveyor belt functional.
Example
input

4
3 3
RRD
DDR
RRC
1 4
DDDC
6 9
RDDDDDRRR
RRDDRRDDD
RRDRDRRDR
DDDDRDDRR
DRRDRDDDR
DDRDRRDDC
1 1
C

output

1
3
9
0

题意:给定一个n×m的传送带,每个位置都有一个字母( R 或者 D )其中R代表向右,D代表向下。我们可以通过改变字母,从而改变传送带的方向,将行李运到C的位置。要使得传送带上的行李 能到达C处,求出我们至少要进行多少次操作修改字母。
题解:传送带只能往下和往右,过程中一定会到下边界和右边界。所以要到达C,即右边界的R改成D,下边界的D改成R即可。做法就是,遍历字符:

  • 当遍历到右边界的时候,如果该字符是R,则cnt +1(需要改为D)
  • 当遍历到下边界的时候,如果该字符是D,则cnt +1(需要改为R)

代码如下:

#include
#include
#include
#include
#include
#include
using namespace std;
int main()
{
	int t;
	cin >> t;
	string str[110];
	while (t--)
	{
		int n, m;
		cin >> n >> m; 
		for (int i = 0; i < n; i++)
			cin >> str[i];
		int cnt = 0;//需要统计的最少修改次数。
		for (int i = 0; i < n; i++)
			for (int j = 0; j < m; j++)
			{
				if (str[i][j] == 'D' && i == n - 1)//最后一行的D要改成R
					cnt++;
				if (str[i][j] == 'R' && j == m - 1)//最后一列的R要改成D
					cnt++;
			}
		printf("%d\n",res);
	}
	return 0;
}

Note
In the first case, just changing the direction of ( 2 , 3 ) (2,3) (2,3) to D is enough.

You can verify that the resulting belt is functional. For example, if we place any luggage at ( 2 , 2 ) (2,2) (2,2), it first moves to ( 3 , 2 ) (3,2) (3,2) and then to ( 3 , 3 ) (3,3) (3,3).

In the second case, we have no option but to change the first 3 3 3 cells from D D D to R R R making the grid equal to R R R C RRRC RRRC.

你可能感兴趣的:(codeforces)