就是想的把最边上的一圈检测一遍,有0的地方就往里边灌水(改为*),最后统计数组0的数量这样子的思路
by yr是yr @ 2023-11-15 17:56:20
然后自己也构造了很多数据测试了都没问题,但是交上去就全都WA
by yr是yr @ 2023-11-15 17:58:06
@[yr是yr](/user/562647) 你 IO 写炸了,可能是系统差异导致的,改成用 ```cin``` 读入就过了
```cpp
#include <stdio.h>
#include <iostream>
using std::cin;
int x, y;
int map[505][505];
char ch;
int answer = 0;
void check_safe(int a,int b)
{
map[a][b] = 1;
//深搜
if(map[a-1][b] == 0)
{
check_safe(a-1,b);
}
if(map[a][b-1] == 0)
{
check_safe(a,b-1);
}
if(map[a+1][b] == 0)
{
check_safe(a+1,b);
}
if(map[a][b+1] == 0)
{
check_safe(a,b+1);
}
return;
}
void get_answer(int a,int b)
{
if((a == 1 || a == x || b == 1 || b == y) && map[a][b] == 0)
check_safe(a,b);
return;
}
int main()
{
cin>>x>>y;
for(int i = 0;i <= y+1;i++)
{
map[0][i] = 1;
map[x + 1][i] = 1;
}
for(int i = 0;i <= x+1;i++)
{
map[i][0] = 1;
map[i][y + 1] = 1;
}
for(int i = 1;i <= x;i++)
{
for(int j = 1;j <= y;j++)
{
cin>>ch;
if(ch == '0')
map[i][j] = 0;
if(ch == '*')
map[i][j] = 1;
if(ch == '\n')
j--;
}
}
for(int i = 1;i <= x;i++)
{
get_answer(i, 1);
get_answer(i, y);
}
for(int i = 1;i <= y;i++)
{
get_answer(1, i);
get_answer(x, i);
}
for(int i = 1;i <= x;i++)
{
for(int j = 1;j <= y;j++)
{
if(map[i][j] == 0)
answer++;
}
}
printf("%d",answer);
return 0;
}
```
by unsigned_short_int @ 2023-11-15 18:29:56
@[int_unsigned_short](/user/427154)
by yr是yr @ 2023-11-15 19:54:01
```
```
为什么会炸啊佬,就是说我了解的printf和scanf好像在数据大的时候运行会比cin和cout快,具体不知道我这个炸在哪儿了,求详解
by yr是yr @ 2023-11-15 19:57:55
@[yr是yr](/user/562647) 数据可能是在 windows 下造的,这样换行符是 `\r\n`,也有可能是行末存在空格。
by unsigned_short_int @ 2023-11-15 20:06:31
所以说,其实不能算是 `scanf` 的问题
by unsigned_short_int @ 2023-11-15 20:07:12
@[yr是yr](/user/562647)
AC code::
```cpp
#include<bits/stdc++.h>
using namespace std;
int n,m,s=0,ans=0;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int water[1024][1024];
void dfs(int x,int y){
if(x<0||y<0||x>n+1||y>m+1||water[x][y]){
return ;
}
water[x][y]=-1;
for(int i=0;i<4;i++){
dfs(x+dx[i],y+dy[i]);
}
}
int main(){
cin>>n>>m;
char ts;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>ts;
if(ts=='*')water[i][j]=1;
else water[i][j]=0;
}
}
dfs(0,0);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(!water[i][j]){
ans++;
}
}
}
cout<<ans;
return 0;
}
```
by Zmin_Juipter @ 2023-11-25 20:35:51