蛋疼无比的推箱子模拟题,又写了我好久。。代码又烂又长,还好一次A了。。
#include<stdio.h>
#include<string.h>
static int h, w, a[20][20];
static int min(int aa, int bb)
{
return aa < bb ? aa : bb;
}
static int maxr()
{
int i, j, res = 0, sum;
for (i = 0; i < h; i++)
{
sum = 0;
for (j = 0; j < w; j++)
if (a[i][j])
sum++;
if (sum > res)
res = sum;
}
return res;
}
static int maxc()
{
int i, j, res = 0, sum;
for (j = 0; j < w; j++)
{
sum = 0;
for (i = 0; i < h; i++)
if (a[i][j])
sum++;
if (sum > res)
res = sum;
}
return res;
}
static void move(char *s, int m)
{
int i, j;
if (strcmp(s, "down") == 0)
{
m = min(h - maxc(), m);
for (j = 0; j < w; j++)
{
int total = 0;
for (i = 0; i < m; i++)
if (a[i][j])
{
total++;
a[i][j] = 0;
}
if (total)
{
int empty = 0;
for (i = m; i < h; i++)
{
if (a[i][j])
total++;
empty++;
a[i][j] = 1;
if (empty == total)
break;
}
}
}
}
else if (strcmp(s, "left") == 0)
{
m = min(w - maxr(), m);
for (i = 0; i < h; i++)
{
int total = 0;
for (j = w - m; j < w; j++)
if (a[i][j])
{
total++;
a[i][j] = 0;
}
if (total)
{
int empty = 0;
for (j = w - m - 1; j >= 0; j--)
{
if (a[i][j])
total++;
empty++;
a[i][j] = 1;
if (empty == total)
break;
}
}
}
}
else if (strcmp(s, "up") == 0)
{
m = min(h - maxc(), m);
for (j = 0; j < w; j++)
{
int total = 0;
for (i = h - m; i < h; i++)
if (a[i][j])
{
total++;
a[i][j] = 0;
}
if (total)
{
int empty = 0;
for (i = h - m - 1; i >= 0; i--)
{
if (a[i][j])
total++;
empty++;
a[i][j] = 1;
if (empty == total)
break;
}
}
}
}
else
{
m = min(w - maxr(), m);
for (i = 0; i < h; i++)
{
int total = 0;
for (j = 0; j < m; j++)
if (a[i][j])
{
total++;
a[i][j] = 0;
}
if (total)
{
int empty = 0;
for (j = m; j < w; j++)
{
if (a[i][j])
total++;
empty++;
a[i][j] = 1;
if (empty == total)
break;
}
}
}
}
}
static void print(int c)
{
int i, j;
printf("Data set %d ends with boxes at locations", c);
for (i = 0; i < h; i++)
for (j = 0; j < w; j++)
if (a[i][j])
printf(" (%d,%d)", i, j);
puts(".");
}
int main()
{
int count = 1;
while (scanf("%d %d", &h, &w), h || w)
{
int n, i, ri, ci;
scanf("%d", &n);
memset(a, 0, sizeof(a));
for (i = 0; i < n; i++)
{
scanf("%d %d", &ri, &ci);
a[ri][ci] = 1;
}
char s[10];
int m;
while (scanf("%s", s), strcmp(s, "done"))
{
scanf("%d", &m);
move(s, m);
}
print(count++);
}
return 0;
}