poj 1111 新手路过

 这是一道比较适合我的深搜题,自我感觉这题比较好,做了很久才搞定,下面附代码;

注意在x处理周长时考虑全面;

#include<iostream>
#include<fstream>
#include<cstring>
using namespace std;
char map[25][25];
int visit[25][25];
int count;
int m,n;
int bam[8][2]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};

void dfs(int a,int b)//开始深搜
{

visit[a][b]=1;
int i;
for(i=0;i<8;i++)
{
int x=a+bam[i][0];
int y=b+bam[i][1];

if(x>=1&&x<=m&&y>=1&&y<=n)排除超出数组边界的范围
{

if(map[x][y]=='X'&&visit[x][y]==0)//判断符合数组范围内的点是否是x,如果是开始深搜
dfs(x,y);

else if(map[x][y]=='.'&&(x==a||y==b))

//同时判断符合数组范围内的点在上下左右四个方向是否有‘。’,有的话count加一
{
count++;

}
}
else if(x==a||y==b)超出数组范围的点(即处理在边界的点)
count++;
}

}

int main ()

{

int x,y;

ifstream cin("in.txt");
while(cin>>m>>n>>x>>y,m+n+x+y)
{

memset(visit,0,sizeof(visit));//数组初始化
memset(map,0,sizeof(map));
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
cin>>map[i][j];
}

}
count=0;
dfs(x,y);
cout<<count<<endl;;
}
return 0;
}

 

posted on 2012-09-19 09:31  元点之始  阅读(224)  评论(0编辑  收藏  举报

导航