Crossword Answers
题意:
就是按照行和列来读取单词,前置第一个字母的编号。
编号的规则:第一行和第一列都有编号,其他位置只有左边或者上边有 * 的时候才有编号,编号从 1 递增
解题思路:
按行读取的很好办,按次序依次读完就可以了。
至于按列读取的话,由于读取顺序的问题,不能一列一列的读,所以还是只能一行一行读,读到字母的时候直接往下走,为了避免重复,我们这里把所有读过的字母全部变成 *
代码:
#include<iostream>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <cmath>
using namespace std;
char mp[15][15];
int num[15][15];
int main()
{
int n,m,ca=1;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
scanf("%d",&m);
getchar();
for(int i=0; i<n; i++)
gets(mp[i]);
//对所有字符编号
int len=1;
memset(num,0,sizeof(num));
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
if(i==0 || j==0)
{
if(mp[i][j] != '*')
num[i][j] = len++;
}
else
{
if(mp[i][j] != '*')
if(mp[i-1][j]=='*' || mp[i][j-1]=='*')
num[i][j] = len++;
}
}
if(ca!=1)
printf("\n");
printf("puzzle #%d:\n",ca++);
printf("Across\n");
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
if(mp[i][j]!='*')
{
printf("%3d.",num[i][j]);
while(j<m&&mp[i][j]!='*')
{
printf("%c",mp[i][j++]);
}
j--;
printf("\n");
}
}
}
printf("Down\n");
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
if(mp[i][j]!='*')
{
printf("%3d.",num[i][j]);
int k=i;
while(k<n&&mp[k][j]!='*')
{
printf("%c",mp[k][j]);
mp[k][j]='*';
k++;
}
printf("\n");
}
}
}
}
return 0;
}