题目链接:https://vjudge.net/problem/UVA-232
题解:需要注意:
1.across和down每个位置的标号一样,只是顺序不一样。
2.输出的格式:要写%3d,并且数字和字符串之间·是‘.’
3.注意各种细节问题
4.标号是上面或是左面是黑色或是没有块才能标号
代码:
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<cstdio>
#define maxn 300
using namespace std;
int r,c;
string s[maxn];
string ans[maxn];
int bi[maxn];//储存标号
int cou;//每一行每一列标号
int con;//across字符串的标号
int con2;//down的标号
int fl[maxn][maxn];//标志
void biao()
{
cou=1;
for(int i=0; i<r; i++)
{
int flag=0;//判断前面是否有*
for(int j=0; j<c; j++)
{
int flag2=0;//判断是否进行下一步操作
if(i==0&&s[i][j]!='*')
{
fl[i][j]=cou;
cou++;
flag2=1;
}
if(j==0&&s[i][j]!='*'&&!flag2)
{
fl[i][j]=cou;
cou++;
flag2=1;
}
if(i!=0&&j!=0&&!flag2&&s[i][j]!='*')
{
if(s[i-1][j]=='*'||s[i][j-1]=='*')
{
fl[i][j]=cou;
cou++;
}
}
}
}
}
void answer()
{
con=0;
int f;//判断前面是否有*
for(int i=0;i<r;i++)
{
f=0;
for(int j=0;j<c;j++)
{
if(s[i][j]!='*'&&!f)
{con++;bi[con]=fl[i][j];}
if(s[i][j]=='*')
f=0;
else if(s[i][j]!='*')
f=1;
if(f==1)
ans[con]+=s[i][j];
}
}
}
void answer2()
{
con2=0;
int f;//判断前面是否有*
int ff[maxn][maxn];//标志是否用过
memset(ff,0,sizeof(ff));
for(int i=0;i<r;i++)
{
for(int j=0;j<c;j++)
{
f=0;//标记是否是第一个
if(s[i][j]!='*')
{
for(int k=i; k<r; k++)
{
if(ff[k][j]==1||s[k][j]=='*')
break;
ff[k][j]=1;
if(!f)
{
con2++;
bi[con2]=fl[i][j];
f=1;
}
if(f)
{
ans[con2]+=s[k][j];
}
}
}
}
}
}
void init()
{
memset(ans,0,sizeof(ans));
memset(bi,0,sizeof(bi));
}
int main()
{
int cc=0;
while(cin>>r&&r)
{
cc++;
if(cc!=1)
cout<<endl;
cin>>c;
cout<<"puzzle #"<<cc<<":"<<endl;
cout<<"Across"<<endl;
init();
for(int i=0; i<r; i++)
cin>>s[i];
biao();
answer();
for(int i=1;i<=con;i++)
{
printf(" %2d.",bi[i]);
cout<<ans[i]<<endl;
}
init();
answer2();
cout<<"Down"<<endl;
for(int i=1;i<=con2;i++)
{
printf("%3d.",bi[i]);
cout<<ans[i]<<endl;
}
}
return 0;
}