DFS 水题
求周长:若当前状态旁边有k个x,则总周长加4-x
1 #include <iostream>
2 #include <stdio.h>
3 #include <string.h>
4 using namespace std;
5
6 const int maxx=20;
7 int dir[8][2]={{0,-1},{1,0},{0,1},{-1,0},{1,-1},{1,1},{-1,1},{-1,-1}};
8 int cnt,n,m;
9 char c[maxx+2][maxx+2];
10 bool visit[maxx+2][maxx+2];
11 bool judge(int a,int b)
12 {
13 if(c[a][b]=='X' && a>=1 && a<=n && b>=1 && b<=m) return 1;
14 return 0;
15 }
16
17 void dfs(int x,int y)
18 {
19 int i,j,tmp,a,b;
20 for(i=0;i<=7;i++)
21 {
22 a=x+dir[i][0];
23 b=y+dir[i][1];
24 if(judge(a,b) && !visit[a][b])
25 {
26 visit[a][b]=1;
27 tmp=0;
28 for(j=0;j<=3;j++)
29 if(judge(a+dir[j][0],b+dir[j][1]))
30 tmp++;
31 cnt=cnt+4-tmp;
32 dfs(a,b);
33 }
34 }
35 }
36
37 int main()
38 {
39 int x,y,i,j;
40 //freopen("in.txt","r",stdin);
41 while(scanf("%d%d%d%d",&n,&m,&x,&y)!=EOF)
42 {
43 if(n==0 && m==0 && x==0 && y==0)
44 break;
45 memset(visit,0,sizeof(visit));
46 for(i=1;i<=n;i++)
47 for(j=1;j<=m;j++)
48 cin>>c[i][j];
49 cnt=0;
50 visit[x][y]=1;
51 for(j=0;j<=3;j++)
52 if(judge(x+dir[j][0],y+dir[j][1]))
53 cnt++;
54 cnt=4-cnt;
55 dfs(x,y);
56 printf("%d\n",cnt);
57 }
58 return 0;
59 }