POJ 1111 - Image Perimeters

来源:互联网 发布:java学生考试系统源码 编辑:程序博客网 时间:2024/05/19 13:22

很简单的dfs,求的是图形块的周长,有一定规律,我就不细说了,详见代码


#include <iostream>#include <cstring>using namespace std;char mat[25][25];bool vis[25][25];int n,m;void dfs(int x,int y){    if(x<1||y<1||x>n||y>m)return;    if(!vis[x][y]&&mat[x][y]=='X')    {        vis[x][y]=1;        dfs(x,y-1);        dfs(x,y+1);        dfs(x-1,y);        dfs(x+1,y);        dfs(x-1,y-1);        dfs(x-1,y+1);        dfs(x+1,y-1);        dfs(x+1,y+1);    }}int main(){    int r,c;    while(cin>>n>>m>>r>>c)    {     if(!n&&!m&&!r&&!c)     break;     memset(vis,0,sizeof(vis));     for(int i=1;i<=n;i++)     for(int j=1;j<=m;j++)     cin>>mat[i][j];     dfs(r,c);     int ans=0;     for(int i=1;i<=n;i++)     for(int j=1;j<=m;j++)     {         if(vis[i][j])         {         int count=0;         if(vis[i-1][j])count++;         if(vis[i+1][j])count++;         if(vis[i][j-1])count++;         if(vis[i][j+1])count++;         ans+=4-count;         }     }        cout<<ans<<endl;    }    return 0;}