UVa 232 - Crossword Answers
2016-12-19 20:57
435 查看
输入一个r行c列(1≤r,c≤10)的网格,黑格用“*”表示,每个白格都填有一个字母。如果一个白格的左边相邻位置或者上边相邻位置没有白格(可能是黑格,也可能出
了网格边界),则称这个白格是一个起始格。首先把所有起始格按照从上到下、从左到右的顺序编号为1, 2, 3,…,如图3-7所示。
接下来要找出所有横向单词(Across)。这些单词必须从一个起始格开始,向右延伸到一个黑格的左边或者整个网格的最右列。最后找出所有竖向单词(Down)。
这些单词必须从一个起始格开始,向下延伸到一个黑格的上边或者整个网格的最下行。输入输出格式和样例请参考原题。
#include <stdio.h>
#include <string.h>
char s[10][10];
int flag[10][10];
int flag1[10][10]; /*竖着输出时的标志*/
int main()
{
int r,c,id,k;
id = 0;
scanf("%d",&r);
while(1)
{
id++;
scanf("%d",&c);
memset(flag,0,sizeof(flag));
memset(flag1,0,sizeof(flag1));
k = 1;
for(int i = 0; i < r; i++)
{
getchar(); //避免换行符号对下面scanf("%c",&s[i][j])的影响
for(int j = 0; j < c; j++)
{
scanf("%c",&s[i][j]);
if(s[i][j] != '*')
{
if(i == 0 || j == 0 || s[i-1][j] == '*' || s[i][j-1] == '*')
{
flag[i][j] = k;
k++;
}
}
}
}
printf("puzzle #%d:\n",id);
printf("Across\n");
for(int i = 0; i < r; i++)
{
for(int j = 0; j < c;)
{
if(s[i][j] != '*')
{
if(flag[i][j] >= 10) //格式
printf(" ");
else
printf(" ");
printf("%d.",flag[i][j]);
while(j < c && s[i][j] != '*')
{
if(j+1 < c && s[i][j+1] != '*') //格式要求
printf("%c",s[i][j]);
else
printf("%c\n",s[i][j]);
j++;
}
}
j++;
}
}
printf("Down\n");
for (int i = 0; i < r; i++)
{
for(int j = 0; j < c; j++)
{
if(flag1[i][j] == 0)
{
if(s[i][j] != '*')
{
if(flag[i][j] >= 10) //格式
printf(" ");
else
printf(" ");
printf("%d.",flag[i][j]);
int k = 0;
while(i+k < r && s[i+k][j] != '*')
{
if(i+k+1 < r && s[i+k+1][j] != '*') //格式要求
printf("%c",s[i+k][j]);
else
printf("%c\n",s[i+k][j]);
flag1[i+k][j] = 1;
k++;
}
}
}
}
}
scanf("%d",&r);
if(r != 0)
printf("\n");
else
break;
}
return 0;
}
了网格边界),则称这个白格是一个起始格。首先把所有起始格按照从上到下、从左到右的顺序编号为1, 2, 3,…,如图3-7所示。
接下来要找出所有横向单词(Across)。这些单词必须从一个起始格开始,向右延伸到一个黑格的左边或者整个网格的最右列。最后找出所有竖向单词(Down)。
这些单词必须从一个起始格开始,向下延伸到一个黑格的上边或者整个网格的最下行。输入输出格式和样例请参考原题。
#include <stdio.h>
#include <string.h>
char s[10][10];
int flag[10][10];
int flag1[10][10]; /*竖着输出时的标志*/
int main()
{
int r,c,id,k;
id = 0;
scanf("%d",&r);
while(1)
{
id++;
scanf("%d",&c);
memset(flag,0,sizeof(flag));
memset(flag1,0,sizeof(flag1));
k = 1;
for(int i = 0; i < r; i++)
{
getchar(); //避免换行符号对下面scanf("%c",&s[i][j])的影响
for(int j = 0; j < c; j++)
{
scanf("%c",&s[i][j]);
if(s[i][j] != '*')
{
if(i == 0 || j == 0 || s[i-1][j] == '*' || s[i][j-1] == '*')
{
flag[i][j] = k;
k++;
}
}
}
}
printf("puzzle #%d:\n",id);
printf("Across\n");
for(int i = 0; i < r; i++)
{
for(int j = 0; j < c;)
{
if(s[i][j] != '*')
{
if(flag[i][j] >= 10) //格式
printf(" ");
else
printf(" ");
printf("%d.",flag[i][j]);
while(j < c && s[i][j] != '*')
{
if(j+1 < c && s[i][j+1] != '*') //格式要求
printf("%c",s[i][j]);
else
printf("%c\n",s[i][j]);
j++;
}
}
j++;
}
}
printf("Down\n");
for (int i = 0; i < r; i++)
{
for(int j = 0; j < c; j++)
{
if(flag1[i][j] == 0)
{
if(s[i][j] != '*')
{
if(flag[i][j] >= 10) //格式
printf(" ");
else
printf(" ");
printf("%d.",flag[i][j]);
int k = 0;
while(i+k < r && s[i+k][j] != '*')
{
if(i+k+1 < r && s[i+k+1][j] != '*') //格式要求
printf("%c",s[i+k][j]);
else
printf("%c\n",s[i+k][j]);
flag1[i+k][j] = 1;
k++;
}
}
}
}
}
scanf("%d",&r);
if(r != 0)
printf("\n");
else
break;
}
return 0;
}
相关文章推荐
- 操作系统之进程的状态
- ECMAScript6(ES6)标准之数组Array扩展方法
- System.currentTimeMillis()笔记
- 通过监听器实现在线人数统计
- JVM 学习 第 2 课 虚拟机class文件从哪里寻找?哪里来?
- [C#]DataGridView自动调整列宽
- 初学activemq 关键字识别与介绍
- Python IO 编程
- mac os系统复制粘贴ctrl+c ctrl+v快捷键实现方式
- 解析XML格式数据--Pull解析
- java中使用队列:java.util.Queue (转)
- Codeforces Round #387 (Div. 2) C && coedeforces 744 C Servers(水题)
- 利用Python从数据公司接口获取数据并输出excel格式
- poj 1127 简单几何+并查集
- ubuntu 安装搜狗输入法(解决部分ubuntu安装完没有键盘选择栏)
- PHP设计模式(七)适配器模式(Adapter For PHP)
- OpenCV+C++中IplImage与Mat 的关系和相互转换
- HTML5--Web存储
- 实习每日总结_20161219
- Shell中实现字符串反转