zoukankan      html  css  js  c++  java
  • 求图像周长(回溯)

    时限: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);
    }
  • 相关阅读:
    第十五节课:习题讲解
    第十四节课:字典
    Python第十三节课-文件的读取和写入
    Python第十二节课--循环语句与注释
    Python第十一节课--字符串的格式化
    Python第十节课==对象的方法
    Python第九节课--初识函数
    初识函数--文件的读取和打开,已一节课一节课分开,可不看
    刷题647. Palindromic Substrings
    刷题617. Merge Two Binary Trees
  • 原文地址:https://www.cnblogs.com/IThaitian/p/2595668.html
Copyright © 2011-2022 走看看