【♂Not The Triumph♂O(∩_∩)O哈哈~But The Struggle♂】

竞赛决不是捷径,它只是另一种艰辛的生活方式。得到与失去,只有时间会去评判;成功与失败,只有历史能去仲裁。我不会永远成功,正如我不会永远失败一样

  C++博客 :: 首页 :: 联系 ::  :: 管理
  6 Posts :: 239 Stories :: 25 Comments :: 0 Trackbacks

常用链接

留言簿(7)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 104696
  • 排名 - 233

最新评论

阅读排行榜

评论排行榜

迷宫的管理员们决定在新开始的季节里使用新的墙纸。出于这个目的他们需要一个程序来计算迷宫内墙壁的面积。这就是你即将要做的工作。

我们把这个迷宫用一个N*N (3 <= N <= 33) 的矩阵表示。一些矩阵单元包含一个 “ .” (这代表一个空的方块),另一些矩阵单元包含一个“ #” (这代表一个用巨石砌成的石墙占据的方块)。全部方块的大小都为 3*3 平方米。

墙壁由迷宫的四周(除了作为迷宫出入口的左上角和右下角以外)以及那些标记为“ #” 的矩阵单元构成,除此之外没有其他的墙。在输入的矩阵里左上角和右下角永远是一个“ .”。


你的任务是计算迷宫里可见部分的墙壁的面积。换句话说,就是对迷宫的游客来说墙壁表面可见的部分。注意在两块相邻的石块之间没有空隙,即使两块石块在转角处相接触,我们都认为它们是相邻的。看看图示的例子:迷宫中可见的墙壁都用加粗的线条来描画。所有墙壁的高度都是三米。

input:
输入的第一行包含一个数字N。接下来的N行每行都包含有N个字符。每行描述了迷宫矩阵的一行。每行都只有“ .” 、“ #” 这两个字符并都以一个换行符结束。输入里没有任何的空格。

output:
你的程序必须输出一个整数,即所需要的壁纸的准确面积。

input:
5
.....
...##
..#..
..###
.....

output:
198

【参考程序】:
#include<iostream>
using namespace std;
struct node
{
    
int x,y;
} list[
1500];
const int dx[4]={-1,0,1,0};
const int dy[4]={0,1,0,-1};
char map[40][40];
bool bo[40][40];
int n,ans;
int main()
{
    scanf(
"%d",&n);getchar();
    
for (int i=1;i<=n;i++)
    {
        
for (int j=1;j<=n;j++)
            scanf(
"%c",&map[i][j]);
        getchar();
    }
    
for (int i=1;i<=n;i++)
    {
        map[
0][i]='#';map[i][0]='#';
        map[i][n
+1]='#';map[n+1][i]='#';
    }
    memset(bo,
false,sizeof(bo));
    bo[
1][1]=bo[n][n]=true;
    
int head,tail,tx,ty;
    head
=1;tail=2;
    list[
1].x=1;list[1].y=1;
    list[
2].x=n;list[2].y=n;
    ans
=0;
    
while (head<=tail)
    {
        
for (int i=0;i<=3;i++)
        {
            tx
=list[head].x+dx[i];
            ty
=list[head].y+dy[i];
            
if (map[tx][ty]=='#') ans++;
            
else if (!bo[tx][ty])
            {
                tail
++;
                list[tail].x
=tx;list[tail].y=ty;
                bo[tx][ty]
=true;
            }
        }
        head
++;
    }
    printf(
"%d\n",(ans-4)*9);//[1][1] 和[n][n] 两边多了四个,所以减去才行。
    return 0;
}

 【参考程序】://floodfill(洪水算法)
#include<iostream>
using namespace std;
char map[40][40];
int a[40][40];
int n,ans;
void fill(int x,int y)
{
    
if (x<=0|x>n|y<=0|y>n) return ;
    
if (map[x][y]=='#'return ;
    
if (a[x][y]==0return ;
    a[x][y]
=0;
    fill(x
-1,y);fill(x,y+1);
    fill(x
+1,y);fill(x,y-1);
}
int main()
{
    scanf(
"%d",&n);getchar();
    
for (int i=1;i<=n;i++)
    {
        
for (int j=1;j<=n;j++)
            scanf(
"%c",&map[i][j]);
        getchar();
    }
    memset(a,
0xFF,sizeof(a));
    fill(
1,1);
    fill(n,n);
    ans
=0;
    
for (int i=1;i<=n;i++)
        
for (int j=1;j<=n;j++)
            
if (a[i][j]==0)
            {
                
if (a[i-1][j]==-1) ans++;
                
if (a[i][j+1]==-1) ans++;
                
if (a[i+1][j]==-1) ans++;
                
if (a[i][j-1]==-1) ans++;
            }
    printf(
"%d\n",(ans-4)*9);
    
return 0;
}
posted on 2009-05-29 17:31 开拓者 阅读(390) 评论(0)  编辑 收藏 引用 所属分类: URAL 题解

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理