思路是贪心,方法就是很水的方法。
做法:
1.每次派一个机器人从(1,1)开始往右或往下,走到(24,24)为止。
2.如果当前格子有垃圾,就清除。
3.如果当前所在的格子右边有垃圾,就往右走。否则,往下走。
4.如果走到了最下边,就一直往右走;如果走到了最右边,就一直往下走。
5.一个机器人走完,检查还有没有垃圾。有就再派一个,没有就停止。
Right[i][j]是(i,j)右边的垃圾数;
Down[i][j]是(i,j)下边的垃圾数;
cnt记录总的垃圾数;
res记录机器人数。
Source Code
Problem: 1548 | User: yueashuxia | |
Memory: 400K | Time: 0MS | |
Language: GCC | Result: Accepted |
#include<stdio.h>
char grid[25][25];
int Right[25][25],Down[25][25];
int main(){
int a, b, i, j, k, cnt = 0, res;
while(scanf("%d%d", &a, &b), a != -1 || b != -1)
{
grid[a][b] = 1;
cnt ++;
for(i = 1; i < b; i ++)
{
Right[a][i]++;
}
for(i = 1; i < a; i ++)
{
Down[i][b]++;
}
if(a == 0 && b == 0)
{
cnt--;
for(res = 0; cnt > 0; )
{
res++;
i = j = 1;
while(i < 25 && j < 25)
{
if(grid[i][j] == 1)
{
grid[i][j] = 0;
cnt--;
for(k = 1; k < i; k ++) Down[k][j]--;
for(k = 1; k < j; k ++) Right[i][k]--;
}
if(cnt == 0) break;
if(Right[i][j] > 0)
{
if(j+1 > 24) i++;
else j++;
}
else
{
if(i+1 > 24) j++;
else i++;
}
}
}
printf("%d\n", res);
}
}
return 0;
}