【题目】
Problem H: 糖果迷阵
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 88 Solved: 41
[Submit][Status][Web Board]
Description
Inna 喜欢吃糖和游戏糖果迷阵.今天,他推出了新游戏“糖果迷阵2:刷新”。
游戏由一个nxm的矩阵表组成。矩阵每行包含一个带有侏儒的单元格和一块带有糖果的单元格,和一些空的单元格。游戏有多次操作,每次操作玩家需要选中所有那些侏儒没获得糖果的行,并发出指令“Let’s go!”.之后所有选中行的侏儒开始同时向右移动,每秒每个侏儒只能向当前单元格的右侧相邻单元格移动一格,操作一直持续到发生以下事件之一时:
·一些侏儒到达所在行的最右边
·一些侏儒到达糖果所在单元格获得糖果
当所有侏儒得到糖果时结束
Inna是如此聪明得设计出这个游戏. 可是你们呢? 你的任务是用最优的方法来完成这个游戏,也就是用最少的操作来完成这个游戏。
Input
输入的第一行包含两个整数n和m(1≤N≤1000;2≤M≤1000)。
每个接下来的n行包含m个字符 – 代表这局的“糖果迷阵:刷新”。字符“*”表示该领域的空白单元格,字符“G”代表一个侏儒和字符“S”代表一个糖果。矩阵不包含其他字符。这是保证每行包含一个字符“G”和一个字符“S”。
Output
在一行打印单个整数 - 来表示完成游戏的最优解,或-1如果目标不能在给定的游戏场中可以实现所需的运动或最小数目。
Sample Input
3 4 *G*S G**S *G*S 1 3 S*G
Sample Output
2 -1
HINT
请使用cin>>str; 或者scanf("%s",str); 输入
【题解】
题意:一行一个侏儒一个糖果,做向右的移动操作,问至少做多少次操作使得所有侏儒吃到糖果。
思路:要求所有糖果在侏儒的右边,输出糖果和侏儒之间的距离的不同情况数。
【代码】
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,m,i,j,k;
char a[1005];
int b,c,vis[1005];
while(~scanf("%d%d",&n,&m))
{
int f=1,ans=0;
memset(vis,0,sizeof(vis));
for(k=0;k<n;k++)
{
scanf(" %s",a);
for(i=0;i<m;i++)
if(a[i]=='G')
b=i;
else if(a[i]=='S')
c=i;
if(c-b>0)
{
if(vis[c-b]==0)
{
ans++;
vis[c-b]=1;
}
}
else
{
f=0;break;
}
}
if(f)
printf("%d\n",ans);
else
printf("-1\n");
}
return 0;
}