B. Inna と新しいキャンディーの行列
テストごとの制限時間
1 秒
テストごとのメモリ制限
256 メガバイト
入力
標準入力
出力
標準出力
インナはお菓子と「キャンディ マトリックス」というゲームが好きです。今日、彼女は新しいゲーム「Candy Matrix 2: Reload」を思いつきました。
新しいゲームのフィールドは、サイズ n?×?m の長方形テーブルです。表の各行には、ドワーフの置物が入ったセルが 1 つ、キャンディが入ったセルが 1 つあり、行の他のセルは空です。ゲームは数手続きます。各移動中に、プレイヤーはドワーフがキャンディーのあるセル上にないマトリックスのすべての行を選択し、「行こう!」と叫ぶ必要があります。その後、選択したラインのすべてのドワーフが同時に右に移動し始めます。 1 秒ごとに、各ドワーフは現在のセルの右側にある隣接するセルに移動します。この動きは、次のいずれかのイベントが発生するまで続きます。
選択した行の 1 つのドワーフが、その行の右端のセルに配置されます。
インナは素晴らしいです、とても面白いゲームを思いついたのです。しかし、あなたはどうでしょうか?あなたの仕事は、このゲームを最適にうまくプレイすることです。具体的には、指定されたゲーム フィールドによって、プレイヤーがゲームのゴールに到達するために必要な最小手数を指定する必要があります。
入力
入力の最初の行には、2 つの整数 n と m (1?≤?) が含まれます。 n?≤?1000; 2?≤?m?≤?1000)。
次の n 行にはそれぞれ m 文字が含まれますか? 「Candy Martix 2: Reload」のゲームフィールド。文字「*」はフィールドの空のセルを表し、文字「G」は小人を表し、文字「S」はキャンディーを表します。マトリックスには他の文字は含まれません。各行に文字 "G" と "S" が 1 つずつ含まれることが保証されています。
出力
1 行に 1 つの整数を出力します。ゲームの目的を達成するために必要な最小の手数、または指定されたゲーム フィールドで目的を達成できない場合は -1 のいずれかです。
サンプル テスト
入力
3 4*G*SG**S*G*S
出力
入力
1 3S*G
-1开始题意理解错了,以为只要一行有个G到了S就停止,记录经过多少个S。。。额。。英语渣真心无脑脑补。。2333333。。。<pre class="n"><p></p><p>题目意思:给n*m的方格,每行中都且仅有一个方格含S和G,每一步可以使所有的G向右移,只到发生下列情况:</p><p>1、某个G已到了最后一列。</p><p>2、某个G已到了S。求把所有的G已到S需要的最少的步数。 </p><p>解题思路:</p><p>统计S-G差出现的个数。</p><p>因为两个差相等的话,他们会一起到达S。也就不要算额外的步数。</p>
#include<cstdio>#include<iostream>#include<cstring>#include<queue>#include<algorithm>#include<vector>using namespace std;const int N = 1020;int n , m;int a, b;int s[N];char str[N][N];int flag;int ans;int main(){ while( scanf("%d%d", &n, &m)!=EOF ) { int flag = 0; memset( s, 0, sizeof(s) ); ans = 0; for(int i=0; i<n; i++) { scanf("%s", str[i]); for(int j=0; j<m; j++) { if( str[i][j]=='G' ) a = j; if( str[i][j]=='S' ) b = j; } if( a<b ) s[ b-a ]++; else flag=1; } for( int i=0; i<m; i++ ) { if( s[i] ) ans++; } if( flag ) printf("-1\n"); else printf("%d\n", ans); } return 0;}