POJ 1691
来源:互联网 发布:刷微信阅读量软件 编辑:程序博客网 时间:2024/06/11 19:48
其实这道题一开始没有什么思路,是别人带了节奏之后我一问是DFS加拓扑,上下相邻的连一条边(由上指向下)瞬间就明白了:
代码也很简单,我这么粗心的家伙都1A,就不多解释了,直接上代码:
/*Problem: 1691User: BurglarMemory: 656KTime: 32MSLanguage: G++Result: Accepted*/#include<stdio.h>#include<string.h>#include<algorithm>#include<iostream>#include<math.h>#define MAXN 20#define INF 10000000using namespace std;struct Matrix{ int lx,ly;//左上角的左边 int rx,ry;//右上角的坐标 int color;//矩阵颜色}matrix[MAXN];int n,degree[MAXN],path[MAXN][MAXN];//TOP数组int judge[MAXN];//在DFS是标记是否已经涂过颜色int min_ans;//答案bool have_path(Matrix a,Matrix b)//用于在TOP构图时判断矩阵a是否在矩阵b下方并且相邻{ if(a.ly==0) return false; else if(a.ly==b.ry) { if(a.lx>=b.rx||a.rx<=b.lx) return false; else return true; } else return false;}int Min(int a,int b){ if(a<b) return a; else return b;}void dfs(int now_color,int time,int done)//DFS枚举答案,没什么需要多说的;三个参数从左至右的意义依次是:现在机器人手中的刷子颜色;换刷子的次数;已经涂完的矩阵数;{ if(time>min_ans) return; if(done==n) { min_ans=Min(min_ans,time); return; } else { for(int i=0;i<n;i++) { if(degree[i]==0&&judge[i]==0) { judge[i]=1; for(int j=0;j<n;j++) { if(j==i) continue; else { if(path[i][j]) { degree[j]--; } } } if(now_color==matrix[i].color) dfs(now_color,time,done+1); else dfs(matrix[i].color,time+1,done+1); for(int j=0;j<n;j++) { if(j==i) continue; else { if(path[i][j]) { degree[j]++; } } } judge[i]=0; } } }}int main(){ int t; scanf("%d",&t); while(t--) { //注意初始化 memset(matrix,0,sizeof(matrix)); memset(degree,0,sizeof(degree)); memset(judge,0,sizeof(judge)); memset(path,0,sizeof(path)); min_ans=INF; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d%d%d%d%d",&matrix[i].ly,&matrix[i].lx,&matrix[i].ry,&matrix[i].rx,&matrix[i].color); } for(int i=0;i<n;i++)//TOP构图 { for(int j=0;j<n;j++) { if(i==j) continue; else { if(have_path(matrix[i],matrix[j])) { path[j][i]=1; degree[i]++; } } } } dfs(0,0,0); printf("%d\n",min_ans); } return 0;}
0 0
- POJ 1691
- poj-1691
- poj 1691
- poj 1691 搜索
- poj-1691-暴力DFS
- POJ Period 1691(kmp)
- POJ
- poj
- POJ
- POJ
- poj
- poj
- POJ
- POJ
- poj
- POJ
- POJ
- POJ
- 【初识Oracle】①创建用户以及权限分配
- linux文件系统的系统分析 1-17
- 33_内部和外部函数
- Effective Objective-C(第37-40条)block在栈上?在堆上?
- 关于java中文件删除失败的原因分析
- POJ 1691
- 收藏的链接
- JavaSE 6之脚本引擎让程序如虎添翼
- 2.jQuery UI 简单引入
- error C2137: empty character constant
- 基于Linux的SVN使用说明
- 34_综合实例
- apache kafka源码分析走读-Producer分析
- 递归解Codeforces Round #256 (Div. 2)C. Painting Fence