习题3-6 纵横字谜的答案(Crossword Answers, ACM/ICPC World Finals 1994,
UVa232)
输入一个r行c列(1≤r,c≤10)的网格,黑格用“*”表示,每个白格都填有一个字母。如
果一个白格的左边相邻位置或者上边相邻位置没有白格(可能是黑格,也可能出了网格边
界),则称这个白格是一个起始格。
首先把所有起始格按照从上到下、从左到右的顺序编号为1, 2, 3,…,如图所示。

接下来要找出所有横向单词(Across)。这些单词必须从一个起始格开始,向右延伸到
一个黑格的左边或者整个网格的最右列。最后找出所有竖向单词(Down)。这些单词必须
从一个起始格开始,向下延伸到一个黑格的上边或者整个网格的最下行。
输出时每两行之间有空行

Sample Input
2 2
AT
*O
6 7
AIM*DEN
*ME*ONE
UPON*TO
SO*ERIN
SA*OR
IES*DEA
0
Sample Output
puzzle #1:
Across
1.AT
3.O
Down
1.A
2.TO

puzzle #2:
Across
1.AIM
4.DEN
7.ME
8.ONE
9.UPON
11.TO
12.SO
13.ERIN
15.SA
17.OR
18.IES
19.DEA
Down
1.A
2.IMPOSE
3.MEO
4.DO
5.ENTIRE
6.NEON
9.US
10.NE
14.ROD
16.AS
18.I
20.A

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=830&problem=168&mosmsg=Submission+received+with+ID+20505776

关于char数组和动态指针做的数组
1.前者下标可以越界,后者一旦越界即便没有操作那个地方的元素,也会程序出错。
2.后者好在大小可以自定义。而却因为下标越界问题导致有些算法判断的地方需要多些代码。
(其实即便是动态数组,只要在创建时将行列多建几个就行了)
//以汉字书写顺序,先左到右,在上到下依次边遍历,边输出,
//凡是输出的格子以@代替,之所以不用*代替是为了统计起始格的个数。
//本题因为说了行列的范围,所以直接用char型的二维数组即可。
//而我没注意以为是任意行列的数组,所以用了动态内存分配生成二维数组。(代码数多在这了)
//其他注意点在代码里注释了。
#include<iostream>
#include<iomanip>
using namespace std;int hang,lie;
//测试用的显示函数
//void dis(char **puzz)
//{//    for(int i=0;i<hang;i++)
//    {//        for(int j=0;j<lie;j++)
//            cout<<puzz[i][j];
//        cout<<endl;
//    }
//}
char** creat()
{char **puzz;puzz=new char*[hang];for(int i=0;i<hang;i++)puzz[i]=new char[lie];return puzz;
}void print(char **puzz,char AD)
{int i,j,pi,pj,*pij;//p系列是为打印一组字符的if(AD=='A'){cout<<"Across";pij=&pj;}if(AD=='D'){cout<<"Down";pij=&pi;}int qsg=0;for(i=0;i<hang;i++)for(j=0;j<lie;j++){//cout<<i<<"  "<<j<<"  "<<puzz[i][j]<<"  ????"<<endl;if(puzz[i][j]=='*')//把*当作起始格就不好了continue;bool iff=false;if(j==0||i==0)//找起始格{iff=true;qsg++;}else if(puzz[i][j-1]=='*'||puzz[i-1][j]=='*')//为了防止j-1和i-1小于0的情况{iff=true;qsg++;}if(iff){if(puzz[i][j]=='@')//虽然此元素也在起始格,但是因为已经被走过了,所以不允许其捣乱continue;//不能breakcout<<endl//开始一组才换行,防止多余空行<<setw(3)//注意是3格的右对齐<<qsg<<".";pi=i;pj=j;while(puzz[pi][pj]!='*')//输出across的字符{cout<<puzz[pi][pj];puzz[pi][pj]='@';(*pij)++;if(!(pj<lie&&pi<hang))//一旦下标越界,就会出错break;
//                    if(AD=='A')
//                        j++;
//                    if(AD=='D')
//                        i++;}}//if(pj<lie&&pi<hang)//还有更好的办法吗//yes//cout<<endl;}cout<<endl;
}int main()
{int num=1;while(cin>>hang&&hang!=0){cin>>lie;if(num>1)cout<<endl;cout<<"puzzle #"<<num++<<":"<<endl;char **puzz;puzz=creat();//必须把指针传回来for(int i=0;i<hang;i++)//原始迷宫for(int j=0;j<lie;j++){//puzz[i][j]='o';cin>>puzz[i][j];}//dis(puzz);char **puzz2;puzz2=creat();for(int i=0;i<hang;i++)//克隆的迷宫for(int j=0;j<lie;j++)puzz2[i][j]=puzz[i][j];print(puzz,'A');//cout<<endl;print(puzz2,'D');//    cout<<endl;//  dis(puzz2);}return 0;
}
//AC at 2017/12/18

(题外话:一开始想出大体逻辑花了30+分钟,而一直到写成并通过花了3个晚上的算法题时间+,累计是3+小时吧,写的时候逻辑混乱,代码一改再改。 每次写都会查很多东西。)

uva 232 - Crossword Answers(纵横迷宫)相关推荐

  1. UVA - 232 ​​​​​​​Crossword Answers

    Crossword Answers UVA - 232 题目传送门 直接按照要求寻找遍历一遍即可 AC代码: #include <cstdio> #include <iostream ...

  2. UVa 232 - Crossword Answers

    昨晚看了看,感觉还可以,就把这题写出来了,刚才交的的是WA了一次,原因是最后多了个空行.改了下空行出现的位置,AC了.不得不说UVA判的真严. #include<stdio.h> char ...

  3. Uva 232.Crossword Answers

    下面的输出一定要是%3d的格式来输出序号 另外注意两个解之间的空格 1 #include <cstdio> 2 #include <cstring> 3 using names ...

  4. uva 232 Crossword Answers

    https://vjudge.net/problem/UVA-232 题意: 输入一个r行c列的网格,黑格用"*"来表示,每个白格都填有一个字母.如果一个白格的左边或者上边的相邻位 ...

  5. 232 Crossword Answers

    我用了一天多的时间来做这个题,从连题都看不懂,到思路混乱,到写出来差不多能运行但是有bug的代码,再到将自己写的一百行代码缩减到五十行,再到算法的逐渐精炼,我不管我能写多少代码,但是我希望我写的代码都 ...

  6. UVA232 纵横字谜的答案 Crossword Answers 题解

    题意翻译 输入一个r 行c 列(1<r,.c<10) 的网格,黑格用"*"每个白格都填有一个字母.如果一个白格的左边相邻位置或者上边相邻位置没有白格(可能是黑格,也可能 ...

  7. 习题3-6 纵横字谜的答案(Crossword Answers, ACM/ICPC World Finals 1994, UVa232)

    原题vjudge 输入一个r行c列(1≤r,c≤10)的网格,黑格用"*"表示,每个白格都填有一个字母. 如 果一个白格的左边相邻位置或者上边相邻位置没有白格(可能是黑格,也可能出 ...

  8. UVa232 Crossword Answers(纵横字谜的答案)

    题意: 输入一个r行c列的网格,*表示黑格,字母表示白格.若一个白格位于边界或上方是黑格或左方是黑格,则称其为起始格.找出所有横向单词和竖向单词,其必须从一个起始格开始,到黑格或网格边界为止. 思路: ...

  9. 纵横字谜的答案(Crossword Answers)

    输入一个r行c列(1<=r,c<=10)的网格,黑格用"*"表示,每个白格都填有一个字母,如果一个白格的左边相邻的位置或者边上相邻的位置没有白格(可能是黑格,也可能除了 ...

最新文章

  1. 工作流引擎在视频网站架构中的应用
  2. 10月网民上网高峰时段为晚上8点 比例升至6.64%
  3. python是什么时候发布的_python发布日期
  4. 和老师一定要保持沟通
  5. 如何在Debian 8上安装Percona XtraDB Cluster for MySQL
  6. MySQL的Limit子句
  7. 8月8日发布!三星Galaxy Note 10+ 5G版FCC认证示意图泄露
  8. python读写excel的图片_python解析excel中图片+提取图片
  9. p73_万维网和HTTP协议
  10. 文章复现:SRCNN
  11. Mac美化,GeekTool获取Yahoo天气图片
  12. MIS(管理信息系统)
  13. OC 中 覆盖属性会有提示Auto property synthesis will not synthesize property 'delegate'
  14. 读书笔记:少有人走的路
  15. iPhone6 iPhone6 Plus 屏幕分辨率、尺寸的问题
  16. PentestBOX教程
  17. 微信浏览器iOS复制链接错误
  18. idea maven无法从私服下载jar和plugin
  19. 搭档之家:其次,构建积极的自我实现预言
  20. three.js旋转,材质,灯光使用 —— 太阳地球月亮运动

热门文章

  1. unity-3d摄像头
  2. java在微信朋友圈中植入广告_微信朋友圈广告植入怎么做
  3. HTML之如何在你的网页上放小姐姐图片
  4. java问题解读,String类为什么是final的
  5. html容器自定义宽高比,容器长宽比_aspect-ratio, 宽高比, 会员专栏 教程_W3cplus
  6. 我的Android进阶之旅------Android通过调用Webservice实现天气预报
  7. 2022电商年货节活动时间介绍,电商年货节红包如何领取?
  8. 2022年餐饮行业的10大必看趋势
  9. MSDK手Q邀请透传参数问题:url编解码与base64编解码
  10. root权限下手动安装open gapps.2022-01-31