懂文件教多的高手帮帮小虾

q466580561 2010-07-20 09:25:37
给一个用 . 和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<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;
}



我想把输入从文件读取,但是文件学的不好..... 但是应该不难吧? 谢谢大家啦
...全文
107 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
q466580561 2010-07-20
  • 打赏
  • 举报
回复
有想要答案的 可以回帖找我哦
q466580561 2010-07-20
  • 打赏
  • 举报
回复
我的问题终于解决了 虽然没有得到我要的答案 但是还是谢谢大家的帮助
q466580561 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 localxiao 的回复:]
引用 4 楼 localxiao 的回复:

fopen
fclose
fseek
fread
fwrite
fscanf
fprintf
feof

[/Quote]


fscanf我觉得行 但是上面程序有两个scanf row col又不是全局变量... 我有点乱...
localxiao 2010-07-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 localxiao 的回复:]

fopen
fclose
fseek
fread
fwrite
fscanf
fprintf
feof
应该够了。
[/Quote]

这些函数不都是么。。。
和你常用的IO基本一致。。
q466580561 2010-07-20
  • 打赏
  • 举报
回复
这个真不懂.... 还是不懂... 有没直接替换 scanf("%d%d%d%d",&m,&n,&row,&col);
能运行通过的?坐等...
adamwyb 2010-07-20
  • 打赏
  • 举报
回复

CFile file("1.txt", CFile::modeRead);
char pbuf[100] = {0};
UINT nBytesRead = cfile.Read( pbuf, 100 );
localxiao 2010-07-20
  • 打赏
  • 举报
回复
fopen
fclose
fseek
fread
fwrite
fscanf
fprintf
feof
应该够了。
q466580561 2010-07-20
  • 打赏
  • 举报
回复
诶诶?读取文件的函数ReadFile(),该函数可以将包含完整路径名的文件打开,读取其中以空格分隔的数据元素,并添加到动态数组vData中,你可以像普通数组一样去使用这个动态数组
这个函数能不能行? 但是我也不太会用这函数... 有没有简单的例子呢?
q466580561 2010-07-20
  • 打赏
  • 举报
回复
是一个文件函数吗?
adamwyb 2010-07-20
  • 打赏
  • 举报
回复
看下MSDN的CFile,这个类读取文件很容易。

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧