UVa232-Crossword Answers
思路:
题意是说有一个r*c的表里面有带字母的白块和黑块,有两种起始块儿横向起始块是左边为黑块或者没有东西,纵起始块是上面为黑块或没有东西,一行一行的将起始块从1开始编号,然后分别输出横纵起始块的编号的他们代表的单词,他们代表的单词就是从这个起始块开始找到边界或者找到黑块为止所有字母(横向往右找,纵向往下找)。没什么坑点儿,注意一下两组数据之间有一个空行。
代码:
#include <bits/stdc++.h>
using namespace std;
string mn[11];
int judge(int x,int y)
{
int k=0;
if(mn[x][y]!='*'&&(y==0||mn[x][y-1]=='*')) k++;
if(mn[x][y]!='*'&&(x==0||mn[x-1][y]=='*')) k+=2;
return k;
}
int main()
{
int n,m,count=1;
while(scanf("%d",&n),n)
{
scanf("%d",&m);
for(int i=0;i<n;i++) cin>>mn[i];
if(count>1) cout<<endl;
printf("puzzle #%d:\n",count++);
int num=0;
printf("Across\n");
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
int k=judge(i,j),t;
if(k)num++;
if(k==1||k==3)
{
for(t=j+1;t<m&&mn[i][t]!='*';t++);
printf("%3d.",num);
cout<<mn[i].substr(j,t-j)<<endl;
}
}
}
num=0;
printf("Down\n");
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
int k=judge(i,j),t;
if(k)num++;
if(k==2||k==3)
{
printf("%3d.",num);
for(t=i;t<n&&mn[t][j]!='*';t++)cout<<mn[t][j];
cout<<endl;
}
}
}
}
return 0;
}