noj算法设计——求图象周长

本文介绍了一个C++程序,用于计算由字符组成的二维图像中指定图形的周长。该程序通过深度优先搜索算法遍历图像,统计边界上的点来确定周长。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

求图像的周长

时限: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

C++代码如下:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值