简单搜索 广搜 深搜 随便搜 开始想用vis 标记是否访问过 然后发现访问过的仍需访问 并不能用vis 标记 于是就想了另外一种方法 用三个方向
每次去访问四个对角 只有当 邻接对角 内元素为1 且 相邻两个方格内元素至少有一个为0 才去访问这个点 这样就保证了不会重复访问无用的点
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>
#include <cstdio>
#include <vector>
#include <string>
#include <iterator>
#include <cmath>
#include <deque>
#include <stack>
#include <cctype>
#include <iomanip>
using namespace std;
typedef long long ll;
typedef long double ld;
const int N = 510;
const int INF = 0xfffffff;
const double EPS = 1e-8;
const ll MOD = 1e9 + 7;
const ld PI = acos (-1.0);
#define INFL 0x7fffffffffffffffLL
#define met(a, b) memset(a, b, sizeof(a))
#define put(a) cout << setiosflags(ios::fixed) << setprecision(a)
int dir1[4][2] = {1, 1, 1, -1, -1, 1, -1, -1};
int dir2[4][2] = {0, 1, 0, -1, 0, 1, 0, -1};
int dir3[4][2] = {1, 0, 1, 0, -1, 0, -1, 0};
int g[N][N], m, n, sum;
void bfs ();
struct node
{
int x, y;
};
queue <node> que;
int main ()
{
int t, ca = 1;
scanf ("%d", &t);
while (t--)
{
node te;
int s, x, y;
met (g, 0);
sum = 0;
scanf ("%d%d%d", &m, &n, &s);
for (int i=0; i<s; i++)
{
scanf ("%d%d", &x, &y);
if (g[x][y]) continue;
g[x][y] = 1;
sum++;
te.x = x, te.y = y;
que.push(te);
}
bfs ();
printf ("Case #%d:\n", ca++);
printf ("%d\n", sum);
}
return 0;
}
void bfs ()
{
node sa, q, q1, q2;
while (que.size())
{
sa = que.front();
que.pop();
for (int i=0; i<4; i++)
{
q = q1 = q2 = sa;
q.x += dir1[i][0], q.y += dir1[i][1];
q1.x += dir2[i][0], q1.y += dir2[i][1];
q2.x += dir3[i][0], q2.y += dir3[i][1];
if (q.x > 0 && q.x <= m && q.y > 0 && q.y <= n && g[q.x][q.y] &&(!g[q1.x][q.y] || !g[q2.x][q2.y]))
{
if (!g[q1.x][q1.y]) {g[q1.x][q1.y] = 1; que.push(q1); sum++;}
if (!g[q2.x][q2.y]) {g[q2.x][q2.y] = 1; que.push(q2); sum++;}
}
}
}
}