70,037
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
int m,n;
char a[20][21];
int c1[21][21];
typedef struct
{
int up;
int down;
int right;
int left;
}A;
A cc[400]={{0,0,0,0},{0,0,0,0}};
void change()
{//匹配每一种情况
int i=0,j=0;
c1[0][0]=0;
for(i=1,j=0;i<=m-2;i++)
c1[i][j]=1;
c1[m-1][0]=2;
for(i=m-1,j=1;j<n-1;j++)
c1[i][j]=3;
c1[m-1][n-1]=4;
for(i=1,j=n-1;i<=m-2;i++)
c1[i][j]=5;
c1[0][n-1]=6;
for(i=0,j=1;j<n-1;j++)
c1[i][j]=7;
for(i=1;i<=m-2;i++)
for(j=1;j<=n-2;j++)
c1[i][j]=8;
}
int canpass(int r,int c,int b)
{
if(r>=0 && c>=0 && r<m && c<n )
{
if(a[r][c]=='.')
{
if(b==1)
cc[r*n+c+1].left=1;
if(b==2)
cc[(r-1)*n+c].down=1;
if(b==3)
cc[r*n+c-1].right=1;
if(b==4)
cc[(r+1)*n+c].up=1;
return 0;
}
if(a[r][c]=='X')
return 1;
return 0;
}
return 0;
}
void search(int row,int col)
{//各种可能走的方向
int r,c;
a[row][col]='A';
r=row;
c=col-1;//左
if(canpass(r,c,1))
search(r,c);
r=row+1;
c=col;//下
if(canpass(r,c,2))
search(r,c);
r=row;
c=col+1;//右
if(canpass(r,c,3))
search(r,c);
r=row-1;
c=col;//上
if(canpass(r,c,4))
search(r,c);
r=row-1;
c=col-1;//左上
if(canpass(r,c,5))
search(r,c);
r=row+1;
c=col-1;//左下
if(canpass(r,c,6))
search(r,c);
r=row-1;
c=col+1;//右上
if(canpass(r,c,7))
search(r,c);
r=row+1;
c=col+1;//右下
if(canpass(r,c,8))
search(r,c);
}
//主函数
int main()
{
int t,sum;
int row,col,i,j;
int b[10]={0};//记录每一种情况的边长数
int p[100],q=0;//记录多组测试数据的周长结果
scanf("%d%d%d%d",&m,&n,&row,&col);
while(m!=0 && n!=0 && row!=0 && col!=0)
{
for(i=0;i<m;i++)
scanf("%s",a[i]);
row=row-1;
col=col-1;
if(a[row][col]=='.')
{//点击点是空格,输出0
printf("0\n");
return 0;
}
change();
search(row,col);
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
if(a[i][j]=='A')
{
switch(c1[i][j])
{//分析每一种情况的边长
case 0:b[0] += (cc[i*n+j].down+cc[i*n+j].right+2);break;
case 1:b[1] += (cc[i*n+j].down+cc[i*n+j].up+cc[i*n+j].right+1);break;
case 2:b[2] += (cc[i*n+j].right+cc[i*n+j].up+2);break;
case 3:b[3] += (cc[i*n+j].right+cc[i*n+j].left+cc[i*n+j].up+1);break;
case 4:b[4] += (cc[i*n+j].left+cc[i*n+j].up+2);break;
case 5:b[5] += (cc[i*n+j].down+cc[i*n+j].left+cc[i*n+j].up+1);break;
case 6:b[6] += (cc[i*n+j].left+cc[i*n+j].down+2);break;
case 7:b[7] += (cc[i*n+j].right+cc[i*n+j].left+cc[i*n+j].down+1);break;
case 8:b[8] += (cc[i*n+j].right+cc[i*n+j].left+cc[i*n+j].up+cc[i*n+j].down);break;
}
}
}
}
sum=0;
for(t=0;t<=8;t++)
sum += b[t];
p[q++]=sum;
for(t=0;t<=8;t++)
b[t]=0;
scanf("%d%d%d%d",&m,&n,&row,&col);
}
for(i=0;i<q;i++)
printf("%d\n",p[i]);
return 0;
}
CFile file("1.txt", CFile::modeRead);
char pbuf[100] = {0};
UINT nBytesRead = cfile.Read( pbuf, 100 );