这道题只看紫书的话很难看懂题意,需要结合原题。另外这道题很卡格式,需要注意输出格式。
思路:建立两个数组存迷宫各个位置的所代表的数字,一个字符数组储存迷宫的字符表示。然后找就是了 = =、有点搜索的意思
代码如下:
#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAX_R 11
#define MAX_C 11
int main()
{
int list1[MAX_R][MAX_C], list2[MAX_R][MAX_C];
char list[MAX_R][MAX_C];
int r, c, flag = 0;
while(scanf("%d", &r) && r != 0)
{
if(flag != 0)
{
printf("\n");
}
scanf("%d", &c);
flag++;
memset(list1, 0, sizeof(list1));
memset(list2, 0, sizeof(list2));
int i, j, num = 1;
char le;
getchar();
for(i = 0; i < r; i++)
{
gets(list[i]);
list[i][c] = 0;
}
for(i = 0; i < r; i++)
{
for(j = 0; j < c; j++)
{
if(i == 0&& list[i][j] != '*')
{
list1[i][j] = num;
list2[i][j] = num;
num++;
}
else if(j == 0 && list[i][j] != '*')
{
list1[i][j] = num;
list2[i][j] = num;
num++;
}
else if(list[i][j] != '*'&& (list[i - 1][j] == '*'|| list[i][j - 1] == '*'))
{
list1[i][j] = num;
list2[i][j] = num;
num++;
}
}
}
printf("puzzle #%d:\nAcross\n", flag);
int p;
for(i = 0; i < r; i++)
{
for(j = 0; j < c; j++)
{
if(i == 0&& list[i][j] != '*')
{
printf("%3d.", list1[i][j]);
for(p = j; list1[i][p] != 0&& p < c; p++, j++)
printf("%c", list[i][p]);
printf("\n");
}
else if(i != 0&& list1[i][j] != 0)
{
printf("%3d.", list1[i][j]);
for(p = j; list[i][p] != '*'&& p < c; p++, j++)
printf("%c", list[i][p]);
printf("\n");
}
}
}
printf("Down\n");
for(i = 0; i < r; i++)
{
for(j = 0; j < c; j++)
{
if(list2[i][j] != 0)
{
printf("%3d.", list2[i][j]);
for(p = i; p < r&& list[p][j] != '*'; p++)
{
printf("%c", list[p][j]);
//printf("%d %d\n", p, j);
list2[p][j] = 0;
}
printf("\n");
}
}
}
}
return 0;
}