哎,写搓了,最后扫下矩阵才过。。结果自己太弱,两场都晋级失败,安慰下自己说是大一就好,心里都知道咋回事。。。。。。。
#include<iostream>
using namespace std;
struct up
{
up()
{
x = 0;
y = 1;
}
int x;
int y;
} up1;
struct down
{
down()
{
x = 0;
y = -1;
}
int x;
int y;
} down1;
struct left
{
left()
{
x = -1;
y = 0;
}
int x;
int y;
} left1;
struct right
{
right()
{
x = 1;
y = 0;
}
int x;
int y;
} right1;
int d[4][2] = { 0,1,1,0,0,-1,-1,0 };
int map[505][505];
int n, m;
int ans = 0;
bool judge(int x, int y)
{
if (x<1 || y<1 || x>n || y>m)
return false;
return true;
}
bool check(int x, int y)
{
if (map[x][y] == 1)
return false;
int x1 = 0; int x2 = 0;
int y1 = 0; int y2 = 0;
x1 = x + up1.x; y1 = y + up1.y;
x2 = x + right1.x; y2 = y + right1.y;
if (judge(x1, y1) && judge(x2, y2))
{
if (map[x1][y1] == 1 && map[x2][y2] == 1)
{
ans++;
map[x][y] = 1;
for (int i = 0; i < 4; i++)
{
int tx = x + d[i][0];
int ty = y + d[i][1];
if (tx<1 || ty<1 || tx>n || ty>m)
continue;
check(tx, ty);
}
return true;
}
}
x1 = x + up1.x; y1 = y + up1.y;
x2 = x + left1.x; y2 = y + left1.y;
if (judge(x1, y1) && judge(x2, y2))
{
if (map[x1][y1] == 1 && map[x2][y2] == 1)
{
ans++;
map[x][y] = 1;
for (int i = 0; i < 4; i++)
{
int tx = x + d[i][0];
int ty = y + d[i][1];
if (tx<1 || ty<1 || tx>n || ty>m)
continue;
check(tx, ty);
}
return true;
}
}
x1 = x + left1.x; y1 = y + left1.y;
x2 = x + down1.x; y2 = y + down1.y;
if (judge(x1, y1) && judge(x2, y2))
{
if (map[x1][y1] == 1 && map[x2][y2] == 1)
{
ans++;
map[x][y] = 1;
for (int i = 0; i < 4; i++)
{
int tx = x + d[i][0];
int ty = y + d[i][1];
if (tx<1 || ty<1 || tx>n || ty>m)
continue;
check(tx, ty);
}
return true;
}
}
x1 = x + down1.x; y1 = y + down1.y;
x2 = x + right1.x; y2 = y + right1.y;
if (judge(x1, y1) && judge(x2, y2))
{
if (map[x1][y1] == 1 && map[x2][y2] == 1)
{
ans++;
map[x][y] = 1;
for (int i = 0; i < 4; i++)
{
int tx = x + d[i][0];
int ty = y + d[i][1];
if (tx<1 || ty<1 || tx>n || ty>m)
continue;
check(tx, ty);
}
return true;
}
}
}
int main()
{
int t;
cin >> t;
for (int i = 1; i <= t; i++)
{
ans = 0;
memset(map, 0, sizeof(map));
scanf("%d%d", &n, &m);
int g;
int temp = 0;
scanf("%d", &g);
for (int i = 0; i < g; i++)
{
int x, y;
scanf("%d%d", &x, &y);
if (map[x][y] != 1)
{
temp++;
map[x][y] = 1;
for (int i = 0; i < 4; i++)
{
int tx = x + d[i][0];
int ty = y + d[i][1];
if (tx<1 || ty<1 || tx>n || ty>m)
continue;
check(tx, ty);
}
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= m; j++)
{
if (map[i][j] == 0)
check(i, j);
}
}
printf("Case #%d:\n", i);
printf("%d\n", temp + ans);
}
}