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,对了复杂度也得好好分析下,

原文地址:https://www.cnblogs.com/beiyueya/p/12122823.html