UVa1103古代象形符号
2015-12-08 22:32
337 查看
分析:这个题如果看透了他难度可以降低非常大的一部分,但如果看不透,那这个题会难的让人无奈。真是醉了,这
个题的重点在于每个图形的洞数,说得对。就是洞数,这是这几个符号唯一的差异,因为每个图形的洞数都不同。但
是尽管知道了他们的特征这个题还是有难度的,一组测试数组不知包括一个字母,这即使寻洞也不好找,还记得有这
样一个题,就是拯救总部的那个,模拟洪水从四周入侵,之后看看那几个建筑未被遍历;这个题有同样的思路
首先把把黑点周围的所有空白标记,那么现在所存的空白便只能在洞里;之后遍历每个黑色点,寻找它所包含的洞数
即可。
说到底,DFS,连通块应用,只是改变了一下情景,让题目更繁琐。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#define maxn 210
using namespace std;
int g[maxn][maxn];
int n,m,cnt;
int num[6];
char st[6]={'A','D','J','K','S','W'};
char str[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
int s[16][4]=
{
{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 1, 1},
{0, 1, 0, 0}, {0, 1, 0, 1}, {0, 1, 1, 0}, {0, 1, 1, 1},
{1, 0, 0, 0}, {1, 0, 0, 1}, {1, 0, 1, 0}, {1, 0, 1, 1},
{1, 1, 0, 0}, {1, 1, 0, 1}, {1, 1, 1, 0}, {1, 1, 1, 1}
};//十六进制对应的二进制
bool is_in(int x,int y)
{
if(x>=0&&x<=n+1&&y>=0&&y<=m+1)
return true;
return false;
}
void dfs(int x,int y)
{
if(!is_in(x,y)||g[x][y]!=0)
return;
g[x][y]=-1;
dfs(x+1,y);
dfs(x-1,y);
dfs(x,y-1);
dfs(x,y+1);
}
void dfs2(int x,int y)
{
if(!is_in(x,y)||g[x][y]==-1)
return;
if(!g[x][y])
{
dfs(x,y);
cnt++;
return;
}
g[x][y]=-1;
dfs2(x+1,y);
dfs2(x-1,y);
dfs2(x,y-1);
dfs2(x,y+1);
}
int main()
{
int ca=1;
while(scanf("%d%d",&n,&m) == 2&&n+m)
{
memset(g,0,sizeof(g));
memset(num,0,sizeof(num));
for(int i=1;i<=n;i++)
{
getchar();
char ch;
int len=1;
for(int j=0;j<m;j++)
{
scanf("%c",&ch);
for(int k=0;k<16;k++)
if(ch==str[k])
{
for(int l=0;l<4;l++)
g[i][len++]=s[k][l];
break;
}
}
}
m*=4;
dfs(0,0);//标记周围
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(g[i][j]==1)
{
cnt=0;
dfs2(i,j);//遍历连通块
if(!cnt) num[5]++;
else if(cnt==1) num[0]++;
else if(cnt==2) num[3]++;
else if(cnt==3) num[2]++;
else if(cnt==4) num[4]++;
else num[1]++;
}
printf("Case %d: ",ca++);
for(int i=0;i<6;i++)
while(num[i]--)
printf("%c",st[i]);
puts("");
}
return 0;
}
个题的重点在于每个图形的洞数,说得对。就是洞数,这是这几个符号唯一的差异,因为每个图形的洞数都不同。但
是尽管知道了他们的特征这个题还是有难度的,一组测试数组不知包括一个字母,这即使寻洞也不好找,还记得有这
样一个题,就是拯救总部的那个,模拟洪水从四周入侵,之后看看那几个建筑未被遍历;这个题有同样的思路
首先把把黑点周围的所有空白标记,那么现在所存的空白便只能在洞里;之后遍历每个黑色点,寻找它所包含的洞数
即可。
说到底,DFS,连通块应用,只是改变了一下情景,让题目更繁琐。
代码如下:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <algorithm>
#define maxn 210
using namespace std;
int g[maxn][maxn];
int n,m,cnt;
int num[6];
char st[6]={'A','D','J','K','S','W'};
char str[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
int s[16][4]=
{
{0, 0, 0, 0}, {0, 0, 0, 1}, {0, 0, 1, 0}, {0, 0, 1, 1},
{0, 1, 0, 0}, {0, 1, 0, 1}, {0, 1, 1, 0}, {0, 1, 1, 1},
{1, 0, 0, 0}, {1, 0, 0, 1}, {1, 0, 1, 0}, {1, 0, 1, 1},
{1, 1, 0, 0}, {1, 1, 0, 1}, {1, 1, 1, 0}, {1, 1, 1, 1}
};//十六进制对应的二进制
bool is_in(int x,int y)
{
if(x>=0&&x<=n+1&&y>=0&&y<=m+1)
return true;
return false;
}
void dfs(int x,int y)
{
if(!is_in(x,y)||g[x][y]!=0)
return;
g[x][y]=-1;
dfs(x+1,y);
dfs(x-1,y);
dfs(x,y-1);
dfs(x,y+1);
}
void dfs2(int x,int y)
{
if(!is_in(x,y)||g[x][y]==-1)
return;
if(!g[x][y])
{
dfs(x,y);
cnt++;
return;
}
g[x][y]=-1;
dfs2(x+1,y);
dfs2(x-1,y);
dfs2(x,y-1);
dfs2(x,y+1);
}
int main()
{
int ca=1;
while(scanf("%d%d",&n,&m) == 2&&n+m)
{
memset(g,0,sizeof(g));
memset(num,0,sizeof(num));
for(int i=1;i<=n;i++)
{
getchar();
char ch;
int len=1;
for(int j=0;j<m;j++)
{
scanf("%c",&ch);
for(int k=0;k<16;k++)
if(ch==str[k])
{
for(int l=0;l<4;l++)
g[i][len++]=s[k][l];
break;
}
}
}
m*=4;
dfs(0,0);//标记周围
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(g[i][j]==1)
{
cnt=0;
dfs2(i,j);//遍历连通块
if(!cnt) num[5]++;
else if(cnt==1) num[0]++;
else if(cnt==2) num[3]++;
else if(cnt==3) num[2]++;
else if(cnt==4) num[4]++;
else num[1]++;
}
printf("Case %d: ",ca++);
for(int i=0;i<6;i++)
while(num[i]--)
printf("%c",st[i]);
puts("");
}
return 0;
}
相关文章推荐
- fragment可见时再加载数据
- C语言VS2010环境下打开文件容易出现的问题。
- C语言成长学习题(十六)
- iOS技术面试08:其他 http://blog.sunnyxx.com/2015/07/04/ios-interview/
- ORACLE表空间的创建修改删除
- 线程问题
- 绘制波形图
- NYOJ 55 懒省事的小明
- 【Objective-C学习记录】第七天
- LAMP 2.2 Apache配置静态缓存
- iOS技术面试07:第三方框架
- PHP - FTP上传文件类
- zzulioj 1816: 矩形 (技巧)
- 数据库连接操作
- 求C++数据结构二叉树的宽度
- 结构(公有类)的运算符重载
- Python 教程
- iOS技术面试06:应用程序
- VC++中的通知消息
- 在Android中操作XML数据-读取与解析XML数据/生成与输出XML数据