5 条题解
-
2
漫水
#include<bits/stdc++.h> using namespace std; int n,m,x[4]={0,0,1,-1},y[4]={1,-1,0,0},ans; char c[107][107]; void awa(int sx,int sy) { c[sx][sy]='.'; for (int i=0;i<4;i++) { int nx=sx+x[i],ny=sy+y[i]; if (nx>=1&&nx<=n&&ny>=1&&ny<=m&&c[nx][ny]=='W') { awa(nx,ny); } } } int main() { cin>>n>>m; string s; for (int i=1;i<=n;i++) { cin>>s; for (int j=1;j<=m;j++) c[i][j]=s[j-1]; } for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) if (c[i][j]=='W') { ans++; awa(i,j); } cout<<ans; return 0; }
-
2
这是一道基础深度优先搜索题
众所周知,深搜分为以下几个步骤:
1.判断边界
2.尝试每一种可能
3.继续下一步(递归)
废话不多说上代码:#include <iostream> using namespace std; int sum , n , m , b[105][105] , next[4][2] = {{0 , 1} , {1 , 0} , {0 , -1} , {-1 , 0}}; char map[105][105]; void dfs(int x , int y) { int tx , ty; b[x][y] = 1; for (int i = 0 ; i < 4 ; i++) { tx = x + next[i][0]; ty = y + next[i][1]; if (tx < 1 || tx > n || ty < 1 || ty > m) continue; if (map[tx][ty] == 'W' && b[tx][ty] == 0) { b[tx][ty] = 1; dfs(tx , ty); } } return; } int main() { cin >> n >> m; for (int i = 1 ; i <= n ; i++) { string row;//这里关于输入说一句。因为输入是没有空格,所以要先输入整行,再在字符串里遍历 cin >> row; for (int j = 0 ; j < m ; j++) { map[i][j + 1] = row[j];//赋值时千万不要忘记j+1 } } for (int i = 1 ; i <= n ; i++) { for (int j = 1 ; j <= m ; j++) { if (map[i][j] == 'W' && b[i][j] == 0) { sum++; dfs(i , j); } } } cout << sum; return 0; }
-
1
嗨嗨嗨,我又来了. 今天咱们讲一讲P431.[基础]数池塘(四方向)
思路
这个题目我一开始是用BFS,可是我本人技术菜鸡至极,愣是没做出来,只好去找大佬"参考"代码。 思路如下: 首先,寻找池塘。 其次,如果找到一个池塘,就对其进行DFS,看看能否扩大池塘面积。并且每扩大一次面积就"抽干"这个池塘的水(对于一开始的那个池塘也是如此,表现为vis[x][y]=1,即到过这个池塘) 重复这两步,直到边界条件。
代码
def dfs(x,y): global tab node=[[0,1],[1,0],[-1,0],[0,-1]]#右,下,上,左 tab[x][y]='.'#抽走水,不把其再算成池塘。 for i in range(4): tx=x+node[i][0] ty=y+node[i][1] if tx<0 or tx > a-1 or ty < 0 or ty >b-1: continue #判断是否是思路 if tab[tx][ty] == 'W' and not vis[tx][ty]: vis[tx][ty]=1 dfs(tx,ty) return #已经到边界或已经没有池塘可供扩展了,结束搜索 a,b=list(map(int,input().split())) tab=[] cnt=0 vis=[] for i in range(a): mid=[0]*b vis.append(mid)#初始化vis数组 for i in range(a): tab.append(list(input())) for i in range(a): for j in range(b): if tab[i][j] == 'W': cnt+=1#找到一个池塘,计数 vis[i][j]=1 dfs(i,j) print(cnt)
Loading:30/100……^_^
-
0
#include<bits/stdc++.h>
using namespace std;
int fxx[9]={0,0,1,-1};
int fxy[9]={1,-1,0,0};
int n,m,ans;
char a[105][105];
void dfs(int x,int y){
int r,c;
a[x][y]='.';
for (int i=0;i<4;i++){
r=x+fxx[i];
c=y+fxy[i];
if(r<1||r>n||c<1||c>m||a[r][c]=='.')continue;
a[r][c]='.';
dfs(r,c);
}
}
int main(){
cin >> n >> m;
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++)cin>>a[i][j];
}
ans=0;
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
if (a[i][j]=='W'){
ans++;
dfs(i,j);
}
}
}
cout << ans;
return 0;
}
一个很简单的深搜,广搜也可以,但是很难,因为我不会广搜,尴尬,,ԾㅂԾ,,(ˉ▽ˉ;)...请留赞再走谢谢🌹🌹🌹❤❤❤
-
-2
写题解请注意 鼓励大家写题解,但注意题解格式。
题解一定要有思路解析或代码注释,能否让别人理解你的思路
也是你的能力的检验,不要只放无意义的代码给大家复制,那就失去了做题的初心。
给代码两端加上这个会舒服一些
```cpp
你的代码
```
</span>
这个点在键盘的左上角tab上面那个键,注意切换输入法
#include<iostream> using namespace std; int main() { int n; cin>>n;//这是一个注释 return 0; }
请注意严禁抄袭题解,写题解不要只放代码,需加上你的思路或代码注释。
抄袭题解一经发现直接取消成绩。
题解被删除的可能
- 代码不符合格式规范
- 没有思路讲解或者没有注释,
- 无意义的题解
大家携手共同维护一个良好的编程环境,如果一经发现,多次作乱。可能会被管理员拉黑,请注意,一旦拉黑即失去登陆资格。
- 1
信息
- ID
- 431
- 时间
- 1000ms
- 内存
- 16MiB
- 难度
- 3
- 标签
- 递交数
- 140
- 已通过
- 80
- 上传者