欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Uva 232 Crossword Answers

程序员文章站 2022-07-12 15:41:47
...

写出这题我觉得有以下几个点要突破:

  1. 怎么把数字序号编出来
  2. across输出时怎么判断开始输出,什么时候结束输出
  3. down跟across输出有什么区别

我的解决办法:

  1. 用两个for边循环边输出
  2. 字符在行首||非首行是字母字符并且前一个字符是‘*’ 即开始输出数字
  3. 若遇到*或者超出边框 就结束
#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;
}
相关标签: VS2017 UVa