POJ2386
1,我对我这水平产生了挺大的怀疑。
2,我真是,又没写字符数组!!!
3,反正我觉得你这情况堪忧。
#include<iostream> using namespace std; int n,m; char b[100][100]; int dx[]={1,1,1,0,0,-1,-1,-1};//还可以用循环挺有意思的 int dy[]={1,0,-1,1,-1,0,1,-1}; int cnt=0; int dfs(int x,int y) { b[x][y]='.'; if(x<1||y<1||x>n||y>m) return 0; for(int i=0;i<=7;i++) { int xx=x+dx[i]; int yy=y+dy[i]; if(b[xx][yy]=='W') { dfs(xx,yy); } } return 0; } int main(){ cin>>n>>m; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>b[i][j]; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { if(b[i][j]=='W') { dfs(i,j); cnt++; } } cout<<cnt<<endl; }
4,反正以后写dx[],dy[]倒是有个套路了.
5,其实写之前都没想通,这个确实。然后又觉得自己先写下去会更舒服些。然后就不停bug。害。
6,但是oj上是runtime error;我去。
是不是体现了个时间复杂度的问题。
7,好像就是代码上的一些细节成这些问题了
8,
#include<iostream> using namespace std; int n,m,cnt=0; char b[105][105]; int dx[]={1,1,1,0,0,-1,-1,-1}; int dy[]={1,-1,0,1,-1,1,-1,0}; int dfs(int x,int y) { b[x][y]='.'; for(int i=0;i<=7;i++) { int xx=x+dx[i]; int yy=y+dy[i]; if(xx>=1&&y>=1&&xx<=n&&yy<=m&&b[xx][yy]=='W') dfs(xx,yy); } return 0; } int main(){ cin>>n>>m; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>b[i][j]; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(b[i][j]=='W') { dfs(i,j); cnt++; } cout<<cnt<<endl; }
6,不过dfs的话,似乎除了边界要有return ,最后好像也要return .不管你返回值是什么的。
7,你第二个代码把x,y的范围放到里面其实少了好多步。之前要进的更多。
8,来下费曼吧。
9,费曼出来就是一个满足条件然后执行的过程,
就像你在森林冰火人里面,你一个火人按着那个按钮,门才会开。
我得正确地使用费曼。
10,对了复杂度也得好好分析下,