Uva 232 Crossword Answers
程序员文章站
2022-07-12 15:41:47
...
写出这题我觉得有以下几个点要突破:
- 怎么把数字序号编出来
- across输出时怎么判断开始输出,什么时候结束输出
- down跟across输出有什么区别
我的解决办法:
- 用两个for边循环边输出
- 字符在行首||非首行是字母字符并且前一个字符是‘*’ 即开始输出数字
- 若遇到*或者超出边框 就结束
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<string.h>
#define CMAXN 100
#define RMAXN 50
//按自然数序列标记合法白格子
void numble(int r,int c, char p1[ ][CMAXN],char p2[][CMAXN]) //p1是原字谜;p2是标记
{
int i,j,count = 0; //标记序号
for( i=0;i<r;i++)
for (j = 0; j < c; j++)
{
if (p1[i][j] == '*') continue;
if (i == 0 && p1[0][j] != '*') { count++; p2[i][j] = count; }//标记第一排
else if (p1[i][0] != '*'&&j==0) { count++; p2[i][0] = count; } //标记最左边一竖排
else if (p1[i][j-1] == '*' || p1[i-1][j] == '*') { count++;p2[i][j] = count; } //标记中间剩余部分
}
/*for (i = 0; i < r; i++)
{
for (j = 0; j < c; j++)
printf("%-3d", p2[i][j]); //把数字化的数组输出
printf("\n");
}*/
}
void across(int r, int c, char *p1, char *p2)
{
printf("Across\n");
int i, j,judge_n=0;
for (i=0; i < r; i++)
{
for (j = 0; j <= c; j++) //横向多循环到格子外一格,就是为了输出每组的那个空格。
{
if ((j == 0 && *p1 != '*') || (j != 0 && isalpha(*p1)&&*(p1 - 1) == '*')) { printf(" %d.", *p2); judge_n = 1; } //一组数只能有1个回车。
if (*p1 != '*'&&*p1 != '0') printf("%c", *p1); //所有以开始为标志,设变量judge为1
else { if (judge_n) printf("\n"); judge_n = 0; }
p1++; p2++;
}
p1 += CMAXN - c-1; p2 += CMAXN - c-1; //转到第二行开始
}
}
void down(int r, int c, char *p1, char *p2)
{
printf("Down\n");
int i, j, count = 0;
for (i = 0; i < r; i++)
{
for (j = 0; j < c; j++)
{
if ((i == 0 && *p1 != '*') || (i != 1 && *(p1 - CMAXN) == '*'&&*p1 != '*')) //月保精髓: 1首行,不为* || 2 非首行,自己不为*,上一个为* ,
{
printf(" %d.", *p2);
while (*p1 != '*' && *p1 != '0') //当前指针不为* ,且没有超出行数
{
printf("%c", *p1); p1 += CMAXN; p2 += CMAXN; count++;//记录往下跳多少次
}
printf("\n");
}
p1 = p1 - count * CMAXN + 1; p2 = p2 - count * CMAXN + 1; count = 0;
}
p1 += CMAXN - c; p2 += CMAXN - c;
}
}
int main()
{
int r,c,i,j;
scanf("%d%d", &r, &c);
scanf("%*c"); //清除垃圾字符”回车“
char a[RMAXN][CMAXN], b[RMAXN][CMAXN];
memset(a, '0', sizeof(a));
memset(b, 0, sizeof(b));
for (i = 0; i < r; i++)
for (j = 0; j < c; j++)
scanf("%c", &a[i][j]);
numble(r, c, a, b);
across(r, c, *a, *b);
down(r, c, *a, *b);
system("pause");
return 0;
}
上一篇: 彻底关闭鼠标右键的 “在visual studio中打开”
下一篇: c++ 函数知识点汇总