英语是硬伤。题目大意:每次能让所有不在糖果上的小人一直往右移动直到:
1.到达最右边 2.到达糖果
求所有棋子到达糖果的最小步数,没有则-1。
思路:暴力模拟
不断找到最短的d(minD),往右移动minD步(即所有d减小minD),直到所有d都为0
#include<stdio.h>
const int N=1002;
char mp[N][N];
int g[N],s[N],d[N];
int min(int a,int b){
return a>b?b:a;
}
int main(){
int n,m;
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++)
scanf("%s",mp[i]);
int lose=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(mp[i][j]=='G')
g[i]=j;
else if(mp[i][j]=='S')
s[i]=j;
}
if(g[i]>s[i])
lose=1;
d[i]=s[i]-g[i];
}
if(lose){
printf("-1\n");
return 0;
}
int ans=0;
for(;;){
int minD=N;
for(int i=0;i<n;i++)
if(d[i]>0)
minD=min(minD,d[i]);
if(minD==N) break;
//printf("%d\n",minD);
for(int i=0;i<n;i++)
if(d[i]>0)
d[i]-=minD;
ans++;
}
printf("%d\n",ans);
return 0;
}