这是解题代码,已通过UVa测试。、
#include <stdio.h>
#include<string.h>
struct mmap
{
char a[10][10];
int b[10][10];
} map;
struct mstart
{
int r;
int c;
} start;
int r=2,c=2,n=1;
void find_start(void);
void across (void);
void down(void);
int main(void)
{
int i,j,ans=1;
while (1)
{
scanf("%d",&r);
if (r==0) {
break;
}
scanf("%d",&c);
if(ans>1)
printf("\n");
for (i=0; i<10; i++) {
for (j=0; j<10; j++) {
map.b[i][j]=0;
}
}
for (i=0; i<r; i++)
scanf("%s",map.a[i]);
printf("puzzle #%d:\n",ans++);
find_start();
across();
down();
}
return 0;
}
void find_start()
{
int i,j;
n=1;
for (i=0; i<r; i++)
{
for (j=0; j<c; j++)
{
if (map.a[i][j]!='*')
{
if (i==0||j==0||map.a[i][j-1]=='*'||map.a[i-1][j]=='*')
{
map.b[i][j]=n;
n++;
}
}
}
}
}
void across ()
{
int i=0,j=0,k=0;
printf("Across\n");
for (i=0; i<r; i++)
{
j=0;
if (map.b[i][j]!=0&&map.a[i][j]!='*')
{
printf("%3d.",map.b[i][j]);
for (k=j; k<c; k++)
{
if(map.a[i][k]=='*') break;
printf("%c",map.a[i][k]);
}
printf("\n");
}
for(j=1;j<c;j++)
{
if (map.b[i][j]!=0&&map.a[i][j-1]=='*')
{
printf("%3d.",map.b[i][j]);
for (k=j; k<c; k++)
{
if(map.a[i][k]=='*') break;
printf("%c",map.a[i][k]);
}
printf("\n");
}
}
}
}
void down()
{
int i=0,j=0,k=0;
printf("Down\n");
for (j=0; j<c; j++)
{
if (map.b[i][j]!=0&&map.a[i][j]!='*')
{
printf("%3d.",map.b[i][j]);
for (k=i; k<r; k++)
{
if(map.a[k][j]=='*') break;
printf("%c",map.a[k][j]);
}
printf("\n");
}
}
for (i=1; i<r; i++)
{
for (j=0;j<c;j++)
{
if (map.b[i][j]!=0&&map.a[i-1][j]=='*')
{
printf("%3d.",map.b[i][j]);
for (k=i; k<r; k++)
{
if(map.a[k][j]=='*') break;
printf("%c",map.a[k][j]);
}
// if(map.b[i][j]!=n-1)
printf("\n");
}
}
}
}
遇到的问题如下:
1. 以后遇到相似代码的时候(比如写完了行再写列的时候),一定不要直接复制然后改i/j,这样很容易导致漏改某些参数,而且这些遗漏的地方很难检查并且想找出来很浪费时间。应该模仿者之前的思路重新写,千万注意。
2.输入地图时,运用:
for (i=0; i<r; i++)
scanf("%s",map.a[i]);
当输入的很多行的东西有空格(无法用scanf)时,需要用gets():
while(gets(a[0]))
{
n--;
if(a[0][0]=='Z') break;
for(int i=1; i<=4; i++)
{
gets(a[i]);
}
3.输出时,题干要求两个成功输出之间要有一行空格,如果每成功输出一次就多打一个空格,那么肯定最后结束时也会打一行空格,这样就出现了presentation error了(PE),可以反向思考,即当成功输出第二次或大于两次时,在输出前输出一行空格。如下:
if(ans>1)
printf("\n");
4.细心非常重要