uva232corssword answers模拟
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=93800#problem/F
题意: 输入一个m*n(1<=m,n<=10)的表格,表格由字母和星号组成,每个格是上或左边界或上或左有星号且格子不是星号的从1开始从左向右编号,输出cross和down2组数据,cross是横向单词,down是纵向单词,2个星号之间的是一个单词。字母换行或换列算另一个单词。
思路:建立2个二维数组,第一个放输入的字符数据,第二个放处理后编好号的整形数据,星号的格是-1,横向:是边界或前面是星号的从当前格向右输出,下一个是右边界或下一个是星号停止输出。纵向:从左向右循环每一个格子,是上边界或上面是星号的且当前不是星号的输出,当前列,下一行是下边界或是星号的停止输出。
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; int main() { int m,n,t=0; while(cin>>m&&m) { cin>>n; if(t)cout<<endl; char a[m][n]; int b[m][n]; memset(b,0,sizeof(b)); for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { cin>>a[i][j]; } } int cnt=0; for(int i=0;i<m;i++)//在另一个整形二维数组中编号 { for(int j=0;j<n;j++) { if(a[i][j]=='*') { b[i][j]=-1; } if(b[i][j]>=0) { if(!i||!j) { cnt++; b[i][j]=cnt; } else { if(a[i][j-1]=='*'||a[i-1][j]=='*') { cnt++; b[i][j]=cnt; } } } } } cout<<"puzzle #"<<++t<<":"<<endl; cout<<"Across"<<endl; for(int i=0;i<m;i++)//横向的 { for(int j=0;j<n;j++) { if((j==0||b[i][j-1]==-1)&&b[i][j]>=0) { printf("%3d.",b[i][j]); for(int k=j;k<n;k++) { cout<<a[i][k]; if(b[i][k+1]==-1||k+1==n) { cout<<endl; break; } } } } } cout<<"Down"<<endl; for(int i=0;i<m;i++)//纵向的 { for(int j=0;j<n;j++) { if((i==0||b[i-1][j]==-1)&&b[i][j]>=0) { printf("%3d.",b[i][j]); for(int k=i;k<m;k++) { cout<<a[k][j]; if(b[k+1][j]==-1||k+1==m) { cout<<endl; break; } } } } } } return 0; }
wa了3次,改了3次,第一次将数用printf对齐,第二次将把换行的那条代码换了地方,这个完全没什么用,最后发现,是编的号不对,边界加了一次cnt上左有星加了一次cnt,应该是或关系。