求图像周长(回溯)

时限:1000ms 内存限制:10000K  总时限:3000ms

描述:

给一个用 . 和X表示的图形,图形在上、下、左、右、左上、左下、右上、右下8个方向都被看作是连通的,并且图像中间不会出现空洞,求这个图形的边长。

输入:

首先给出m、n、x、y四个正整数,下面给出m×n的图形,x、y表示点击的位置,全0表示结束。

输出:

点击的图形的周长。

输入样例:

2 2 2 2
XX
XX
6 4 2 3
.XXX
.XXX
.XXX
...X
..X.
X...
0 0 0 0

输出样例:

8

18

#include<iostream>
using namespace std;
int R,C;//行列数    
int num;
void search(char** a,int row,int col);
int canplace(char** a,int row,int col);

int main()
{
    int x,y;
    cin>>R>>C>>x>>y;//行列数R,C点击位置(x,y)    
    while(R!=0||C!=0||x!=0||y!=0)
    {  
        char **Arr = new char*[R];//R行(动态的数组,a就是一个指针数组)
        for(int i=0;i<R;i++)  
            Arr[i] = new char[C];//C列(a[i]:指向字符数组的指针)
        for(int j=0;j<R;j++)
            for(int k=0;k<C;k++)
                cin>>Arr[j][k];  //输入图像布局    
        search(Arr,x-1,y-1);
        cout<<num<<endl;
     
        for(i=0;i<R;i++)
            delete Arr[i];//删除指针数组a中的指针
        delete Arr;//删除指针数组
        num=0;
        cin>>R>>C>>x>>y;//行列数m,n点击位置(x,y)
    }
    return 0;
}
int canplace(char** Arr,int row,int col)
{
    if(row>=0 &&col>=0 &&row<R &&col<C &&Arr[row][col]=='X')//未越界且可走通
        return 1;
    return 0;
}
void search(char**Arr,int row,int col)
{
    int r,c;
    if(row-1<0  ||(row-1>=0&&Arr[row-1][col]=='.'))   num++;
    if(row+1>=R ||(row+1<R&&Arr[row+1][col]=='.' ))   num++;
    if(col-1<0  ||(col-1>=0&&Arr[row][col-1]=='.'))   num++;
    if(col+1>=C ||(col+1<C&&Arr[row][col+1]=='.' ))   num++;
    Arr[row][col]='1';//对可走通的点进行标记

    r=row;  c=col-1;//
    if(canplace(Arr,r,c)) 
        search(Arr,r,c);
    r=row+1;  c=col;//
    if(canplace(Arr,r,c)) 
        search(Arr,r,c);
    r=row;    c=col+1;//
    if(canplace(Arr,r,c))
        search(Arr,r,c);
    r=row-1;  c=col;//
    if(canplace(Arr,r,c))  
        search(Arr,r,c);
    r=row+1;  c=col-1;//左下
    if(canplace(Arr,r,c)) 
        search(Arr,r,c);
    r=row+1;  c=col+1;//右下
    if(canplace(Arr,r,c)) 
        search(Arr,r,c);
    r=row-1;  c=col+1;//右上
    if(canplace(Arr,r,c)) 
        search(Arr,r,c);
    r=row-1;  c=col-1;//左上
    if(canplace(Arr,r,c))
        search(Arr,r,c);
}

转载于:https://www.cnblogs.com/IThaitian/archive/2012/07/17/2595668.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值