0
已解决
#include<iostream> using namespace std; int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; bool g[15][15],vis[15][15]; int cnt,n; void dfs(int x,int y){ for(int i=0;i<4;i++){ int nx=x+dir[i][0]; int ny=y+dir[i][1]; if(nx>=0&&nx<=n&&ny>=0&&ny<=n&&g[nx][ny]==0&&vis[nx][ny]==0){ vis[nx][ny]=1; dfs(nx,ny); } } return ; } int main(){ cin>>n; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cin>>g[i][j]; } } vis[0][0]=1; dfs(0,0); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(g[i][j]==0&&vis[i][j]==0){ cnt++; } } } cout<<cnt; return 0; }//10分
高驰宇在2025-07-24 10:50:24追加了内容
#include<iostream>
using namespace std;
int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
bool g[15][15],vis[15][15];
int cnt,n;
void dfs(int x,int y){
for(int i=0;i<4;i++){
int nx=x+dir[i][0];
int ny=y+dir[i][1];
if(nx>=0&&nx<=n&&ny>=0&&ny<=n&&g[nx][ny]==0&&vis[nx][ny]==0){
vis[nx][ny]=1;
dfs(nx,ny);
}
}
return ;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>g[i][j];
}
}
vis[0][0]=1;
dfs(0,0);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(g[i][j]==0&&vis[i][j]==0){
cnt++;
}
}
}
cout<<cnt;
return 0;
}
0
已采纳
错误的地方:
1. 第10行,应该是nx>=1和ny>=1,注意边界;
2. 第24~25行,这样直接vis[0][0]=1并调用dfs(0,0)显然是错的,做法:
第一个循环:
遍历i:1~n;
判断边界g[i][1]、vis[i][1]是否都为0,是的话就从边界调用dfs(i,1)
判断边界g[i][n]、vis[i][n]是否都为0,是的话就从边界调用dfs(i,n)
那么第二个循环(不嵌套在i:1~n中)
j:1~n
跟上面一样判断边界是否能走、没有被vis访问过,就做边界调用操作,只是要把dfs的调用改成dfs(1, j) dfs(n, j)而已。
0
0
函数部分
void dfs(int x,int y){
for(int i=0;i<4;i++){
int dx=x+dir[i][0],dy=y+dir[i][1];
if(dx>=0&&dx<=n+1&&dy>=0&&dy<=n+1&&a[dx][dy]==0&&!vis[dx][dy]){
vis[dx][dy]=true;
dfs(dx,dy);
}
}
}
主函数
vis[0][0]=true;
dfs(0,0);
int cnt=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[i][j]==0&&!vis[i][j]){
cnt++;
}
}
}
定义和输入输出自己写
0
0