今天打了一场篮球比赛,脚崴了。真的呀,伤病无法预测!可题,是有解的。搜索入门试手题。
典型之典型,怎么做,凉拌炒鸡蛋dfs真好办。杂粮版,咋凉拌?搜索全局真好办!dfs初阶,凉拌大法。
呃.....
读入不说了,char熟组直接cin。策略是什么?循环凉拌,找鸡煲,dfs直到边缘,再换一边跑。怎么跑,自己想,呀!
int dx[4] = {-1,1,0,0};
int dy[4] = {0,0,1,-1};
这啥?不知道?就对了,往下看:
for (int i = 0;i < 4;i++){
int nx = x + dx[i];
int ny = y + dy[i];
dfs(nx,ny);
}
哟,好理解了吧!dx、dy熟组用来对应上下左右。加上前面,用递归朝着上下左右看有没有‘0’,只要到了鸡煲边缘就return,或者是溢出矩阵了,就return。
if (1 > x || x > m || y < 1 || y > n || a[x][y] == '0') return;
对了,虽然我们是没有用到标记数组,可还是要:
a[x][y] = '0';
吃鸡(煲)
void dfs(int x,int y){
if (1 > x || x > m || y < 1 || y > n || a[x][y] == '0') return;
a[x][y] = '0';
for (int i = 0;i < 4;i++){
int nx = x + dx[i];
int ny = y + dy[i];
dfs(nx,ny);
}
}
艾玛,凉拌还是干锅,怎么还缺灵魂汁子,浇给!!!
for (int i = 1;i <= m;i++)
for (int j = 1;j <= n;j++)
if (a[i][j] != '0'){
ans++;
dfs(i,j);
}
只要是我喜欢吃的干锅,就dfs凉拌。否则就直接吃。
哇,我闻到了AC的味道!!!
#include <bits/stdc++.h>
using namespace std;
int n,m;
int dx[4] = {-1,1,0,0};
int dy[4] = {0,0,1,-1};
char a[101][101];
void dfs(int x,int y){
if (1 > x || x > m || y < 1 || y > n || a[x][y] == '0') return;
a[x][y] = '0';
for (int i = 0;i < 4;i++){
int nx = x + dx[i];
int ny = y + dy[i];
dfs(nx,ny);
}
}
int ans;
int main(){
cin >> m >> n;
for (int i = 1;i <= m;i++) for (int j = 1;j <= n;j++) cin >> a[i][j];
for (int i = 1;i <= m;i++)
for (int j = 1;j <= n;j++)
if (a[i][j] != '0'){
ans++;
dfs(i,j);
}
cout << ans << "\n";
return 0;
}
哇好吃,AK战神加油。
加油,骚年!