图论问题,计算房间数量,递归访问四周的格子,遇到墙退回,统计格子数,记录访问后的格子,无法递归时退出,找另外一个房间。

代码:


#include<stdio.h>
#include<string.h>
#define max 100
typedef struct operate
{
 int total;
 char direction;
 int local[2];
}operate;
typedef struct node
{
 int wall[4];
}node;
node map[max][max];
int vis[max][max];
int room[max*max];
int t,l,h;

int dfs(int x,int y)   //x为纵坐标 y为横坐标;
{
 int count=1;
 if(vis[x][y])return 0;
 vis[x][y]=t;
 if(!map[x][y].wall[0]&&x+1<=h)  //南方无墙;
  count+=dfs(x+1,y);
 if(!map[x][y].wall[1]&&y+1<=l)  //东方无墙;
  count+=dfs(x,y+1);
 if(!map[x][y].wall[2]&&x-1>0)  //北方无墙;
  count+=dfs(x-1,y);
 if(!map[x][y].wall[3]&&y-1>0)  //西方无墙;
  count+=dfs(x,y-1);
 return count;
}
void base_2(int num,node* temp)
{
// node temp;
 int i=3;
 while(num!=0)
 {
  temp->wall[i--]=num%2;
  num/=2;
 }
// return temp;
}

operate search(int y,int x)

 int j;
 operate temp;
 temp.total=0;
 if(map[y][x].wall[2]==1&&y-1<=h)      //推倒北墙
 if(vis[y-1][x]!=vis[y][x])
 {
  j=room[vis[y-1][x]]+room[vis[y][x]];
  if(j>temp.total)
  {
   temp.total=j;
   temp.local[0]=y;
   temp.local[1]=x;
   temp.direction='N';
  }
 }
 
 if(map[y][x].wall[1]==1&&x+1<=l)      //推倒东墙
 if(vis[y][x+1]!=vis[y][x])
 {
  j=room[vis[y][x+1]]+room[vis[y][x]];
  if(j>temp.total)
  {
   temp.total=j;
   temp.local[0]=y;
   temp.local[1]=x;
   temp.direction='E';
  }
 }
 return temp;
}
int main()
{
 freopen("castle.out","w",stdout);
 freopen("castle.in","r",stdin);
 int i,j,temp;
// int room[max*max];
 int ans=0;
 operate tp,push;
 scanf("%d%d",&l,&h);
 memset(vis,0,sizeof(vis));
 memset(map,0,sizeof(map));
 for(i=1;i<=h;i++)
 for(j=1;j<=l;j++)
 {
  scanf("%d",&temp);
  base_2(temp,&map[i][j]);

}

 t=1;ans=0;
 for(i=1;i<=h;i++)
 for(j=1;j<=l;j++)
 if(!vis[i][j])
 {
  room[t++]=dfs(i,j);
  ans=ans > room[t-1]? ans : room[t-1];
 }
 
 push.total=0;
 for(i=1;i<=l;i++)
 for(j=h;j>0;j--)
 {
  tp=search(j,i);
  push=push.total>=tp.total? push:tp;
 }

 printf("%d\n",t-1);
 printf("%d\n",ans);
 printf("%d\n",push.total);
 printf("%d %d %c\n",push.local[0],push.local[1],push.direction);
 return 0;
}

思路还是很清晰的,但是调试很困难。把各种操作单独写进一个函数分别调用,可以方便调试。

此外题目中最后一个数据的输出很让人纠结,英文原题的要求:

Choose the optimal wall to remove from the set of optimal walls by choosing the module farthest to the west (and then, if still tied, farthest to the south). If still tied, choose 'N' before 'E'. Name that wall by naming the module that borders it on either the west or south, along with a direction of N or E giving the location of the wall with respect to the module.

这句话必须要仔细斟酌:

选择最佳的墙推倒,从一些模块(也就是格子)的集合中,选择最大程度(farthest在这里这么理解)靠西的模块,和靠南的模块。推墙时,北边的墙优先于东边的墙。模块的边界在西和南,指向北或东,这样就给出了一堵墙关于该模块的位置。

N

第二句很拗口,其实凭感觉就可以理解了,这段话实际是告诉你参考坐标是W     E

S

第一句更重要,它告诉你优先级。因为不同的房间会包含很多个格子,所以有很多个边界格子,推倒这些边界格子的墙让2个房间联通都能得到解,但我们必须按优先级,选择正确的格子,和推倒的墙。

推墙操作只要将格点从西南角向上枚举和向右枚举。先判断推N的后果再判断E,只更新结果大的。

本文使用Blog_Backup未注册版本导出,请到soft.pt42.com注册。

转载于:https://www.cnblogs.com/eggeek/archive/2011/09/26/2281194.html

usaconbsp;chapternbsp;2.1nbsp;castle相关推荐

  1. usaco The Castle

    ★The Castle 城堡 以一个几乎超乎想像的运气,农民约翰在他的生日收到了一张爱尔兰博彩的奖券.这一张奖券成为 了唯一中奖的奖券.农民约翰嬴得爱尔兰的乡下地方的一个传说中的城堡. 吹牛在他们威斯 ...

  2. 将Quartz.NET集成到 Castle中

    Castle是针对.NET平台的一个开源项目,从数据访问框架ORM到IOC容器,再到WEB层的MVC框架.AOP,基本包括了整个开发过程中的所有东西,为我们快速的构建企业级的应用程序提供了很好的服务. ...

  3. Castle ActiveRecord(一)概述

    一.ActiveRecord与Castle ActiveRecord ActiveRecord是<Patterns of Enterprise Application Architecture& ...

  4. Castle IOC容器内幕故事(上)

    摘要:在快速入门指南篇中,我们对于Castle IOC容器的使用已经有了一个直观的认识.本文将在这基础上进一步对Castle IOC容器的结构及其注册组件的过程做一个深入的分析,让我们开始Castle ...

  5. 整理了一个castle的文档,供大家学习使用

    把castle官方网站上面的文档整理了一下,做一个word文档,方便大家离线查看或者打印. Castle Reference Documentation.rar 转载于:https://www.cnb ...

  6. 原来CASTLE RC2 还不支持IBATIS 1.6,郁闷了很久

    原来CASTLE RC2 还不支持IBATIS 1.6,郁闷了很久

  7. Castle ActiveRecord 泛型应用

    Castle ActiveRecord在.Net2.0下支持泛型,这极大的方便了我们创建强类型集合以及对对象的强类型操作.本文引用了Castle站点上泛型的例子来详细介绍如何应用泛型. 另外你需要在这 ...

  8. Castle ActiveRecord学习实践(5):实现Many–Many关系的映射

    摘要:多对多的关系在日常开发中也会经常遇到,在ActiveRecord中我们用HasAndBelongsToMany特性来实现Many-Many的关联,本文将通过一个具体的实例来介绍这一用法. 主要内 ...

  9. Castle IOC容器快速入门

    摘要:IOC模式是近年来非常流行的一种模式,相信大家都不陌生了,如果你还不是很熟悉的话,可以看看Martin Fowler大师的文章http://martinfowler.com/articles/i ...

  10. Castle DynamicProxy基本用法(AOP)

    本文介绍AOP编程的基本概念.Castle DynamicProxy(DP)的基本用法,使用第三方扩展实现对异步(async)的支持,结合Autofac演示如何实现AOP编程. AOP 百科中关于AO ...

最新文章

  1. 深度神经网络对基于EEG的情绪识别的关键频带和通道的研究
  2. leetcode: Linked List Cycle II
  3. Day 31 并发编程
  4. UML类图详解_泛化关系
  5. wdpc V3 phpmyadmin打不开的一种解决方式(实测有效)
  6. 70条WB, IHC常见实验问题解决方案汇总
  7. DCMTK:从命令行修改DICOM文件的类
  8. 数据结构排序算法实验报告_[数据结构与算法系列]排序算法(二)
  9. C# 以管理员身份运行程序
  10. 1008 数组元素循环右移问题 (20)
  11. WordPress文章ajax,使用ajax在WordPress后台删除文章方法
  12. 面试 | 从一个API缓存演化,详细了解Redis各项功能
  13. Controller比较两个对象discs、outlets中的元素是否相等。相同则相应的checkbox为checked...
  14. gvdp哪个工厂用_ppr铝塑管和ppr水管哪个更适合家装?
  15. 实战Detectron2— 训练人体关键点检测
  16. java开发手机app教程,看完必懂
  17. CACM观点:超越联邦学习,让AI跨越公司边界
  18. 微信公众平台系列 一
  19. python初中生有必要学吗_作为初中生该如何学编程?
  20. circular 字体_DebevicCircular字体ttf下载 最新版

热门文章

  1. C++面试题:介绍一下STL,STL如何实现vector
  2. 信用评分卡模型分析(基于Python)--python实现
  3. android spinner控件详解,GitHub - LonelyPluto/TestSpinner: android控件——Spinner下拉框详解及使用...
  4. php_eol为什么没有换行,PHP PHP_EOL 换行符
  5. 局部敏感哈希(Locality Sensitive Hashing,LSH)
  6. uva1583-digit generator
  7. efsframe java_EfsFrame(java开发框架)
  8. 学qt的都干什么工作_【板绘前景】学板绘可以干什么工作?学多久才可以工作?好学吗?...
  9. python机器学习应用mooc_(2)Naive bayes
  10. 计算机网络超详细笔记(六):传输层