UVa - 232 - Crossword Answers
题目链接:https://vjudge.net/problem/UVA-232(VJ)
https://vjudge.net/problem/32396/origin(UVaOJ)
AC代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> #include<iostream> #include<string> #include<cstring> #include<algorithm> using namespace std; void output(int k) { printf("puzzle #%d:\n",k); } int main() { int r,c,k=1,n,z; char cha[11][11]; int num[11][11]; while(scanf("%d",&r)!=EOF&&r) { memset(num,0,sizeof(num)); n=1; scanf("%d",&c); for(int i=0;i<r;i++) scanf("%s",cha[i]); if(k>1) cout<<endl; output(k++); for(int i=0;i<r;i++){ for(int j=0;j<c;j++){ if(i==0&&cha[i][j]!='*') { num[i][j]=n++; continue; } if(j==0&&cha[i][j]!='*') { num[i][j]=n++; continue; } if(cha[i-1][j]=='*'||cha[i][j-1]=='*') { if(cha[i][j]!='*') { num[i][j]=n++; continue; } } } } //Across printf("Across\n"); for(int i=0;i<r;i++){ int t=0; for(int j=0;j<c;j++){ if(cha[i][j]=='*'){ t=0; continue; } if(t==0) { printf(" %2d.",num[i][j]); t=1; } cout<<cha[i][j]; if(cha[i][j+1]=='*'||j+1==c) cout<<endl; } } //Down printf("Down\n"); for(int i=0;i<r;i++){ for(int j=0;j<c;j++){ if(i==0&&cha[i][j]!='*'){ printf(" %2d.",num[i][j]); z=i; while(cha[z][j]!='*'&&z!=r){ cout<<cha[z][j]; z++; } cout<<endl; } else if(cha[i-1][j]=='*'&&cha[i][j]!='*'){ printf(" %2d.",num[i][j]); z=i; while(cha[z][j]!='*'&&z!=r){ cout<<cha[z][j]; z++; } cout<<endl; continue; } } } } return 0; }
解题思路:
1输入行列数
2输入矩阵中的每个值
3对矩阵中每个值所对应的数字进行记录,两种白色矩阵被数字顺序记录的规则,一是黑色矩阵在白色矩阵的左方或者上方,二是白色矩阵的左边或者上面没有矩阵
4输出Across,这个较为简单,只需按序输出即可,因为横向输出list和数字的顺序刚好一致
5输出Down,这个有点复杂,因为需要按数字序输出每一个,我的方法是一行一行的查找,找到可以输出的,然后纵向输出,直到本列结束或者碰到黑色方格
注意:
Separate output for successive input puzzles by a blank line.
对于连续的输入问题,要把输入和输出用空格分开,注意successive意思是第一个输出和输入不分开,因为第二个开始才能算为successive