UVA 232

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

题目大意:

多组输入以0结束,对于每组数据,先输出m n 表示m行n列的矩阵,该矩阵由黑格子和一些字符组成,接下来输入这个矩阵,*代表黑格子,对于每个矩阵,Across输出从第一行开始,先输出首字母的编号(编号指这是第n个连续串,而不是矩阵中的编号),以行为标准的连续的字符串(只要没遇到黑色格子就算连续),对于Down也是从第一行开始,但是是以列为标准,从上往下的输出,先输出编号再输出串,注意:已经输出过的串就不能输出了。

解题思路:

一道很好的模拟题,这里我用了一个数组保存首字符的编号,一个数组存矩阵,另一个数组存该点是否走过,对于Across自然是不用标记数组的,因为是横着输出,本来就能保证每个点就走一次,对于Down,可能这个字符在上一行的时候已经输出了,所以不再输出,初始化一下编号数组,然后模拟即可。AC代码:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <sstream>
#include <map>
using namespace std;
char s[15][15];
int num[15][15],vis[15][15];
int main()
{
	int r,c,k=1;
	while(cin>>r&&r)//以0结尾
	{
		memset(vis,0,sizeof vis);
		cin>>c;
		int cnt=1;
		for(int i=0;i<r;i++)
		{
			for(int j=0;j<c;j++)
			{
				cin>>s[i][j];
				if(isalpha(s[i][j])&&(!i||!j||s[i-1][j] == '*'||s[i][j-1] == '*'))//判是不是这个串的首字符条件:字母或第一行第一列或前面一行的这个位置是*或上一列这个位置是*。
			  	  num[i][j]=cnt++;
			}
		}
		if(k>1)//格式仍要注意 血淋淋の教训
		  cout<<endl;
		printf("puzzle #%d:
",k++);
		printf("Across
");
		for(int i=0;i<r;i++)
		{
			for(int j=0;j<c;j++)
			{
				if(isalpha(s[i][j]))
				{
					printf("%3d.",num[i][j]);
					for(int k=j;k<c;k++,j++)//列标可以跟着移动,这样就不必判走没走过了
					{
						if(!isalpha(s[i][k]))
						  break;
						cout<<s[i][k];
					}
					cout<<endl;
				}
			}
		}
		printf("Down
");
		for(int i=0;i<r;i++)
		{
			for(int j=0;j<c;j++)
			{
				if(isalpha(s[i][j])&&!vis[i][j]&&num[i][j])//竖着的需要判断是不是首字符和走没走过
				{
					printf("%3d.",num[i][j]);
					for(int k=i;k<r;k++)
					{
						if(!isalpha(s[k][j]))
						  break;
						cout<<s[k][j];
						vis[k][j]=1;
					}
					cout<<endl;
				}
			}
		}
	}
	return 0;
}
原文地址:https://www.cnblogs.com/Hayasaka/p/14294232.html