F广搜

<span style="color:#330099;">/*
F - 广搜 基础
Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u
Submit

Status
Description
Technicians in a pathology lab analyze digitized images of slides. Objects on a slide are selected for analysis by a mouse click on the object. The perimeter of the boundary of an object is one useful measure. Your task is to determine this perimeter for selected objects. 

The digitized slides will be represented by a rectangular grid of periods, ‘.‘, indicating empty space, and the capital letter ‘X‘, indicating part of an object. Simple examples are 

XX   Grid 1       .XXX   Grid 2
XX                .XXX
                  .XXX
                  ...X
                  ..X. 

 X... 

An X in a grid square indicates that the entire grid square, including its boundaries, lies in some object. The X in the center of the grid below is adjacent to the X in any of the 8 positions around it. The grid squares for any two adjacent X‘s overlap on an edge or corner, so they are connected. 

XXX
XXX    Central X and adjacent X‘s
XXX 

An object consists of the grid squares of all X‘s that can be linked to one another through a sequence of adjacent X‘s. In Grid 1, the whole grid is filled by one object. In Grid 2 there are two objects. One object contains only the lower left grid square. The remaining X‘s belong to the other object. 

The technician will always click on an X, selecting the object containing that X. The coordinates of the click are recorded. Rows and columns are numbered starting from 1 in the upper left hand corner. The technician could select the object in Grid 1 by clicking on row 2 and column 2. The larger object in Grid 2 could be selected by clicking on row 2, column 3. The click could not be on row 4, column 3. 

One useful statistic is the perimeter of the object. Assume each X corresponds to a square one unit on each side. Hence the object in Grid 1 has perimeter 8 (2 on each of four sides). The perimeter for the larger object in Grid 2 is illustrated in the figure at the left. The length is 18. 

Objects will not contain any totally enclosed holes, so the leftmost grid patterns shown below could NOT appear. The variations on the right could appear: 

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
The input will contain one or more grids. Each grid is preceded by a line containing the number of rows and columns in the grid and the row and column of the mouse click. All numbers are in the range 1-20. The rows of the grid follow, starting on the next line, consisting of ‘.‘ and ‘X‘ characters. 

The end of the input is indicated by a line containing four zeros. The numbers on any one line are separated by blanks. The grid rows contain no blanks.
Output
For each grid in the input, the output contains a single line with the perimeter of the specified object.
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
By Grant Yuan
2014.7.14
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<stack>
#include<cmath>
using namespace std;
char a[21][21];
bool mark[21][21];
int next[8][2]={1,0,0,1,-1,0,0,-1,1,1,1,-1,-1,1,-1,-1};
int sum;
int l,w;
int x2,y2;
int top,base;
typedef  struct{
  int x;
  int y;
  int f;
}node;
node q[500];
bool can(int xx,int yy)
{
    if(xx>=0&&xx<l&&yy>=0&&yy<w&&a[xx][yy]==‘X‘&&mark[xx][yy]==0)
       return 1;
    return 0;
}

void slove()
{  node q1;
   int xx,yy;
   int m,n;
   while(top>=base){
       xx=q[base].x;
       yy=q[base].y;
       for(int i=0;i<8;i++)
          {
              m=xx+next[i][0];
              n=yy+next[i][1];
              if(can(m,n)){
                  q1.x=m;
                  q1.y=n;
                  q1.f=base;
                  q[++top]=q1;
                  mark[m][n]=1;
                  if(i<4) sum=sum+2;
                  else{
                     if(a[xx][n]==‘X‘&&a[m][yy]==‘X‘)
                       sum=sum;
                      else if(a[xx][n]==‘X‘||a[m][yy]==‘X‘)
                        sum=sum+2;
                      else sum=sum+4;}
                }

          }
          base++;

}}
int main()
{   node q1;
    while(1){
      memset(mark,0,sizeof(mark));
      cin>>l>>w>>x2>>y2;
      top=-1;
      base=0;
      if(l==0&&w==0&&x2==0&&y2==0)
         break;
      x2=x2-1;
      y2=y2-1;
      for(int i=0;i<l;i++)
         cin>>a[i];
      sum=0;
      if(a[x2][y2]==‘.‘)
         cout<<sum<<endl;
      else{
          sum=4;
          q1.x=x2;
          q1.y=y2;
          q1.f=0;
          mark[x2][y2]=1;
          q[++top]=q1;
          slove();
          cout<<sum<<endl;
         }
      }
      return 0;
}
</span>
时间: 2024-10-10 20:46:30

F广搜的相关文章

POJ 2251 三维广搜。

B - Dungeon Master Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is com

HDU 3085 Nightmare Ⅱ (双向广搜)

题意:有M,G两人和鬼魂(Z)在n*m的方格内,M每秒走3步,G每秒走一步,鬼魂每秒走2步,问是否能 不遇到鬼魂下两人相遇,鬼魂可以穿墙(X),人不可以.初始鬼魂有2个. #include<stdio.h> #include<string.h> #include<string> #include<queue> #include<map> #include<iostream> #include<algorithm> #def

POJ_2251(初识广搜)

Description You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of unit cubes which may or may not be filled with rock. It takes one minute to move one unit north, south, east, west, up or down. You cannot m

双向广搜的DIJKSTRA算法--简易的北京地铁导航实现

本学期的课程设计,实现最短路的算法,于是采用了DIJKSTRA算法,并用双向广搜优化了. 实现了简易的北京地铁导航.于是把代码分享出来. (核心代码是find_min(),Dijkstra()部分) 转载或者用到里面的代码请注明博主姓名以及出处! (注:只输入了图片里的地铁站信息,所用到的文件最下面有下载,因为这些文件是我和同学一条一条的录入的,所以如果你用到请务必注明这些文件的出处) 代码: /**************************************************

Poj3414广搜

<span style="color:#330099;">/* D - D Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3414 Description You are given two pots, having the volume of A and B liters respectively. The follow

nyoj 999——师傅又被妖怪抓走了——————【双广搜】

师傅又被妖怪抓走了 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 话说唐僧复得了孙行者,师徒们一心同体,共诣西方.自宝象国救了公主,承君臣送出城西,沿路饥餐渴饮,悟空便为师傅去化斋,等悟空回来,悟净慌慌张张的对悟空说:“不好了,不好了”,还没等悟净说完,悟空说:“师傅又被妖怪抓走了”,悟净:“NO!” ,悟空一脸茫然,悟净:“师傅和二师兄都被妖怪抓走了”.悟空(晕!).为了防止悟空救人,妖怪先把唐憎和八戒分别藏起来,如果悟空在T分钟之后还没找到人,那必定是被妖怪吃

nyist 999 师傅又被妖怪抓走了 【双广搜 || BFS +状态压缩】

题目:nyist 999 师傅又被妖怪抓走了 分析:在一个图中只要看到D点和E点就行的最小步数,看到的定义是:也就是说两个人在同一行或者同一列,并且中间没有障碍物或者没有其他人就可以看到对方. 所以可以先预处理地图,把D点和E点所在的行列的' .'扩展为d和e,然后只要搜到d和e就可以,问题是只有d和e同时搜到才行,直接广搜肯定不行,我们可以在搜到d点之后然后在从当前点广搜e点,或者e点广搜d点,这样第一次搜到的点不一定是最优的,所以需要枚举所有情况才行,时间复杂度较高. 比较好的一种方法是BF

洛谷P1132 数字生成计划 广搜

洛谷P1132 数字生成计划 广搜 三种操作 因为要步数最少,所以广搜 1 #include <bits/stdc++.h> 2 #define For(i,j,k) for(int i=j;i<=k;i++) 3 using namespace std ; 4 5 const int N = 1000011 ; 6 struct node{ 7 int a,ans ; 8 }; 9 bool flag[N] ; 10 int f[N] ; 11 queue<node> q;

迷宫问题(深搜 广搜)

题目描述: 给出一个m*n的迷宫图和一个入口,一个出口. 编一个程序,打印一条从迷宫入口到出口的路径. -1表示走不通,0表示能走,只能上下左右走: 无路可走输出"no way": 样例输入: 8 5-1 -1 -1 -1 -1 0 0 0 0 -1-1 -1 -1 0 -1-1 0 0 0 -1-1 0 0 1 -1-1 0 0 0 -1-1 -1 -1 0 -1-1 0 0 0 -12 18 4 8 5-1 -1 -1 -1 -10 0 0 0 -1-1 -1 -1 0 -1-1