Crossword Answers
2015-10-15 17:53
155 查看
Uva232
这道题只要根据输出来输出,另外注意不管行还是列每个字符都只会用一次,所以标记就行了。
这道题只要根据输出来输出,另外注意不管行还是列每个字符都只会用一次,所以标记就行了。
#include <stdio.h> #include <string.h> #define clr( a ) memset ( a, 0, sizeof ( a ) ) const int maxn = 15; int vis[maxn][maxn], value[maxn][maxn]; char str[maxn][maxn]; int main ( ) { int n, m, begin, cas = 0; while ( ~ scanf ( "%d", &n ) && n ) { clr ( value ); scanf ( "%d", &m ); for ( int i = 0; i < n; i ++ ) scanf ( "%s", str[i] ); begin = 1; for ( int i = 0; i < n; i ++ ) for ( int j = 0; j < m; j ++ ) if ( ( i == 0 || j == 0 || str[i-1][j] == '*' || str[i][j-1] == '*' ) && str[i][j] != '*' ) //注意还需要判断本身是否是*,不然就不赋值 value[i][j] = begin ++; if ( cas ++ ) printf ( "\n" ); printf ( "puzzle #%d:\n", cas ); clr ( vis ); //标记哪些字符被用了 printf ( "Across\n" ); for ( int i = 0; i < n; i ++ ) for ( int j = 0; j < m; j ++ ) { if ( vis[i][j] || value[i][j] == 0 ) continue ; printf ( "%3d.", value[i][j] ); //占三位 while ( j < m && str[i][j] != '*' ) { printf ( "%c", str[i][j] ); vis[i][j] = 1; //行其实不用标记 j ++; } j --; printf ( "\n" ); } clr ( vis ); printf ( "Down\n" ); //这部分要根据样例输出来输出 for ( int i = 0; i < n; i ++ ) for ( int j = 0; j < m; j ++ ) { if ( vis[i][j] || value[i][j] == 0 ) continue ; printf ( "%3d.", value[i][j] ); int k = i; while ( k < n && str[k][j] != '*' ) { printf ( "%c", str[k][j] ); vis[k][j] = 1; //列必须标记 k ++; } printf ( "\n" ); } } return 0; }
相关文章推荐
- linux下部署tomcat项目
- stopPropagation
- POJ 1003 Hangover
- 加州理工大学公开课:机器学习与数据挖掘_线性模型(第三个教训)
- C#中哈希表(HashTable)的用法详解
- 洛谷1076 寻宝
- Cobub Razor
- Mac自带svn,Versions,Cornerstone初识
- 关于shell下出现"未预期的符号问题"
- 【C疯狂的教材】(四)C语言分支语句
- 导演类
- Node.js开发环境介绍-调试工具
- egrep匹配行尾失败的问题分析
- iOS开发005 OpenCV--基于模板图片的标记识别
- mac php memcached
- Curl 使用笔记
- 理解闭包
- 2、Struts2引入多个配置文件
- Hadoop之sequencefile与text类型转化
- Android WebView不能执行Ajax的解决办法