https://vjudge.net/problem/UVA-232
将给出的网格转化成对应的二维数组,根据要求生成需要的信息数组,依旧是UVa题目的细节格式特色(恶心),比如某些地方读入空格回车的处理,整数输出占3位等
int main()
{
/*UVa 232 2019.12.29
*/
int r,c;
char maps[10][10];//读入网格
int code[10][10];//生成要求的起始格信息
int vis[10][10];//按列输出时用,后面说
int cases=0;
while(scanf("%d",&r)!=EOF&&r){
scanf("%d",&c);
getchar();
for(int i=0;i<r;++i){
gets(maps[i]);
}
int countc=0;
memset(code,0,sizeof(code));
memset(vis,0,sizeof(vis));
for(int i=0;i<r;i++){
for(int j=0;j<c;j++)
{
if(maps[i][j]!='*')
{
if(i-1<0||j-1<0||maps[i-1][j]=='*'||maps[i][j-1]=='*')
code[i][j]=++countc;
}
}
}
if(cases++) printf("\n");
printf("puzzle #%d:\n",cases);
printf("Across\n");
for(int i=0;i<r;i++)
for(int j=0;j<c;j++){
if(code[i][j]>0){
printf("%3d.",code[i][j]);
while(maps[i][j]!='*'&&j<c) {
printf("%c",maps[i][j]);
j++;
}
printf("\n");
}
}
printf("Down\n");//这儿直接把二维数组按列优先输出的话顺序不对
for(int i=0;i<r;i++)//所以这里还是按行优先来,但是加个vis数组做标记
for(int j=0;j<c;j++){
if(code[i][j]>0&&!vis[i][j]){//已经输出的就不再输出了,类似DFS和BFS的思路
int tmp = i;
printf("%3d.",code[i][j]);
while(maps[i][j]!='*'&&i<r) {
printf("%c",maps[i][j]);
vis[i][j]=1;
i++;
}
printf("\n");
i = tmp;
}
}
}
}