您的位置:首页 > 其它

Crossword Answer UVa232

2016-03-09 19:03 477 查看

Crossword Answer



[align=left]这是一道比较基础的题目,放在《算法竞赛入门经典》第三章,主要是考了字符串和数组,有点需要基本功。[/align]
[align=left]题目的意思是一个给定一个R*C的方格,上面有些有字母,有些是空的,然后要找出上面所有横向的和纵向的单词。单词要求必须从最边界开始或者从一个空格之后或者空格之下开始。[/align]
[align=left]然后还有一个地方就是每个单词都要有序号,序号先列后行,但是输出的时候又要先输出行,所以每个列要记录起来,输完行了再输出了列,这样有点小麻烦,不过耐心一点也还好。[/align]
[align=left]最后有一个注意的地方是输出,要严格的看清楚输出格式,这个很容易出错。输出要求每两个输出之间要有空行,序号还要占3列输出。[/align]
[align=left]代码如下:[/align]
#include <iostream>
#include <stdio.h>
#include <cstring>
using namespace std;
int r, c;
void getAcross(char cross[10][10], int i, int j)//直接输出横向上面的单词
{
while (i < r && j < c && cross[i][j] != '*')
{
cout << cross[i][j];
j++;
}
cout << endl;
}

void getDown(char cross[10][10],char line[1000][15], int i, int j, int x, int y)
{
while (i < r && j < c && cross[i][j] != '*')//记录到line数组里面去
{
line[x][y] = cross[i][j];
i++; y++;
}
line[x][y] = '\0';
}

int main()
{
char cross[10][10],line[1000][15];//line数组用来存放碰到的列方向上的单词
int i, j, ALL = 1;
while (cin >> r, r)
{
cin >> c;
getchar();
for (i = 0; i < r; i++)
cin >> cross[i];
int num = 1,curX = 0, curY = 0; //curX,curY用来记录当前line数组的位置。
if(ALL != 1) cout << endl;//如果是第一组,打印一个换行
cout << "puzzle #" << ALL++ << ":" << endl;
cout << "Across" << endl;
for (i = 0; i < r; i++)
{
for (j = 0; j < c; j++)
{
if (cross[i][j] == '*') continue;
bool log = 0;//判断当前位置是否构成单词,然后控制序号num的增加
if ((j == 0 && cross[i][j] != '*') || (j != 0 && cross[i][j - 1] == '*'))//如果碰到横向的单词,直接输出
{
printf("%3d.",num);
getAcross(cross, i, j);
log = 1;
}
if ((i == 0 && cross[i][j] != '*') || (i != 0 && cross[i - 1][j] == '*'))//列向的单词,不输出,记录起来
{
line[curX][curY] = num + '0';
getDown(cross, line, i, j, curX, curY+1);
curX++; curY = 0;
log = 1;
}
if(log) num++;
}

}
cout << "Down" << endl;
int temp;
for (i = 0; i < curX; i++)//输出列方向上的单词
{
temp = line[i][0] - '0';
printf("%3d.", temp);
for (j = 1; line[i][j];j++)
cout << line[i][j] ;
cout << endl;
}

/*
cout << endl;
for (i = 0; i < r; i++)
cout << cross[i] << endl;
*/
}

//while (1) getchar();
return 0;
}
/*
2 2
AT
*O
6 7
AIM*DEN
*ME*ONE
UPON*TO
SO*ERIN
*SA*OR*
IES*DEA
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: