zzqer居然搜的时候 i<=n 了 ,导致卡了很久。
DFS 代码:
#include <iostream>
#include <queue>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN = 1000 + 10;
const int INF = 1e9;
const int dx[] = {0,1,0,-1,0};
const int dy[] = {0,0,-1,0,1};
int n, m, ans = 1;
int h[MAXN][MAXN];
bool vis[MAXN][MAXN];
void spread(int x, int y)
{
for(int i = 1; i <= 4; i ++)
{
int nx = x + dx[i];
int ny = y + dy[i];
if(nx >= 1 && nx <= n && ny >= 1 && ny <= m && h[nx][ny] <= h[x][y] && !vis[nx][ny])
{
vis[nx][ny] = 1;
ans ++;
spread(nx,ny);
}
}
}
int main()
{
scanf("%d%d", &n, &m);
memset(h,0x3f,sizeof(h));
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
scanf("%d", &h[i][j]);
int r, c;
scanf("%d%d", &r, &c);
spread(r,c);
cout << n*m-ans << endl;
return 0;
}
BFS 代码:
#include <iostream>
#include <queue>
#include <cstring>
#include <cstdio>
using namespace std;
const int MAXN = 1000 + 10;
const int INF = 1e9;
const int dx[] = {0,1,0,-1,0};
const int dy[] = {0,0,-1,0,1};
int n, m, ans = 1;
int h[MAXN][MAXN];
bool vis[MAXN][MAXN];
struct Poi{
int x, y;
};
queue <Poi> q;
void spread(int x, int y)
{
q.push((Poi){x,y});
vis[x][y] = 1;
while(q.size())
{
Poi now = q.front();
q.pop();
for(int i = 1; i <= 4; i ++)
{
int nx = now.x + dx[i];
int ny = now.y + dy[i];
if(nx >= 1 && nx <= n && ny >= 1 && ny <= m && h[nx][ny] <= h[now.x][now.y] && !vis[nx][ny])
{
ans ++;
vis[nx][ny] = 1;
q.push((Poi){nx,ny});
}
}
}
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
scanf("%d", &h[i][j]);
int r, c;
scanf("%d%d", &r, &c);
spread(r,c);
ans = 0;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
if(!vis[i][j])
ans ++;
cout << ans << endl;
return 0;
}