标签:
Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u
Description
XX Grid 1 .XXX Grid 2
XX .XXX
.XXX
...X
..X.
X...
XXX
XXX Central X and adjacent X‘s
XXX
Impossible Possible
XXXX XXXX XXXX XXXX
X..X XXXX X... X...
XX.X XXXX XX.X XX.X
XXXX XXXX XXXX XX.X
..... ..... ..... .....
..X.. ..X.. ..X.. ..X..
.X.X. .XXX. .X... .....
..X.. ..X.. ..X.. ..X..
..... ..... ..... .....
Input
Output
Sample Input
2 2 2 2 XX XX 6 4 2 3 .XXX .XXX .XXX ...X ..X. X... 5 6 1 3 .XXXX. X....X ..XX.X .X...X ..XXX. 7 7 2 6 XXXXXXX XX...XX X..X..X X..X... X..X..X X.....X XXXXXXX 7 7 4 4 XXXXXXX XX...XX X..X..X X..X... X..X..X X.....X XXXXXXX 0 0 0 0
Sample Output
8 18 40 48 8
题目大意:给你一个矩形图,上面有着用X组成的物体,每一个X与他周围8个方向上的X算是相邻,所有相邻的X算作一个物体,题目会给你搜索的起点,以此确定到底是哪一个物体,然后让你输出该物体的周长,
每一个X的边长为1,结合样例很容易明白其周长的计算方法。
思路分析:首先是,周长应该通过什么来进行确定,一个X上下左右不是‘X‘就‘.‘,X说明相邻,‘.‘则说明那一侧是边界,所以说可以通过计算该物体中的X周‘.‘的个数来间接求出其周长。注意应该开两个方向数组,
一个是8个方向,用来寻找下一个X,进行深搜,一个是4个方向,用来寻找边界,计算周长。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
const int maxn=105;
char maps[maxn][maxn];
int f[8][2]={{1,0},{-1,0},{0,1},{0,-1},{-1,-1},{-1,1},{1,-1},{1,1}};
int m,n,p,q;
int cnt,flag;
void dfs(int x,int y)
{
maps[x][y]=‘*‘;
for(int i=0;i<4;i++)
{
int a=x+f[i][0];
int b=y+f[i][1];
if(maps[a][b]==‘.‘) cnt++;
}
for(int i=0;i<8;i++)
{
int a=x+f[i][0];
int b=y+f[i][1];
if(maps[a][b]==‘X‘) dfs(a,b);
}
}
int main()
{
while(scanf("%d%d%d%d",&m,&n,&p,&q)&&(m||n||p||q))
{ cnt=0;
int i,j;
memset(maps,‘.‘,sizeof(maps));
for(i=1;i<=m;i++) for(j=1;j<=n;j++)
cin>>maps[i][j];
dfs(p,q);
cout<<cnt<<endl;
}
}
深搜就是状态的转移,你所要做的就是确定两个,一个是在这个状态你要做什么,另一就是如何判断是否进入下一个状态。
永不停息!
标签:
原文地址:http://www.cnblogs.com/xuejianye/p/5314166.html