时限: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); }