poj 2585 Window Pains 暴力枚举排列

题意:

在4*4的格子中有9个窗体,窗体会覆盖它之下的窗体,问是否存在一个窗体放置的顺序使得最后的结果与输入同样。

分析:

在数据规模较小且不须要剪枝的情况下能够暴力(思路清晰代码简单),暴力一般分为枚举子集(for(s=0;s<1<<n;++s))和枚举排列(next_permutation)。

代码:

//poj 2585
//sep9
#include <iostream>
#include <algorithm>
using namespace std;
int order[10];
int a[8][8],tmp[8][8];
char s[16];

int main()
{
	while(1){
		scanf("%s",s);
		if(s[0]=='E')
			break;
		int i,j;
		for(i=0;i<4;++i)
			for(j=0;j<4;++j)
				scanf("%d",&a[i][j]);
		int ok=0;
		for(i=1;i<=9;++i)
			order[i]=i;
		do{
			for(i=0;i<4;++i)
				for(j=0;j<4;++j)
					tmp[i][j]=0;
			for(i=1;i<=9;++i){
				int t=order[i];
				tmp[(t-1)/3][(t-1)%3]=t;
				tmp[(t-1)/3][(t-1)%3+1]=t;
				tmp[(t-1)/3+1][(t-1)%3]=t;
				tmp[(t-1)/3+1][(t-1)%3+1]=t;
			}
			int equal=1;
			for(i=0;i<4&&equal;++i)
				for(j=0;j<4&&equal;++j)
					if(a[i][j]!=tmp[i][j])
						equal=0;
			if(equal==1){
				ok=1;
				break;
			}
		}while(next_permutation(order+1,order+10));
		if(ok==0)
			puts("THESE WINDOWS ARE BROKEN");
		else
			puts("THESE WINDOWS ARE CLEAN");
		scanf("%*s");
	}
	return 0;
} 
时间: 2024-10-10 20:29:24

poj 2585 Window Pains 暴力枚举排列的相关文章

poj 2585 Window Pains 解题报告

Window Pains Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2027   Accepted: 1025 Description Boudreaux likes to multitask, especially when it comes to using his computer. Never satisfied with just running one application at a time, he

POJ 2585.Window Pains

Window Pains Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1888   Accepted: 944 Description Boudreaux likes to multitask, especially when it comes to using his computer. Never satisfied with just running one application at a time, he u

poj 2585 Window Pains(拓扑排序)(经典)(困难)

Window Pains Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1756   Accepted: 881 Description Boudreaux likes to multitask, especially when it comes to using his computer. Never satisfied with just running one application at a time, he u

POJ 2585 Window Pains(拓扑排序&#183;窗口覆盖)

题意  有一个4*4的显示器  有9个程序  每个程序占2*2个格子  他们的位置如图所示  当你运行某个程序时  这个程序就会显示在顶层覆盖其它的程序  给你某个时刻显示器的截图  判断此时电脑是否死机了(出现了不合法的覆盖关系) 拓扑排序的应用  关键是建图  当一个程序A的区域上有其它程序B时  说明A是在B之前运行的  那么我们可以建立一个A<B的拓扑关系  最后判断是否有环就行了  个人认为下标换为0操作起来比较方便  所以都还为了0 #include <cstdio> #in

POJ 2585 Window Pains 题解

链接:http://poj.org/problem?id=2585 题意: 某个人有一个屏幕大小为4*4的电脑,他很喜欢打开窗口,他肯定打开9个窗口,每个窗口大小2*2.并且每个窗口肯定在固定的位置上(见题目上的图),某些窗口可以覆盖另一些窗口(可以脑补).询问给出的电脑屏幕是否是合法的. 分析: 可以预先处理出每个格子应该有哪几个窗口在这上面,将最上面的窗口与其他窗口连边,得到一张图,用拓扑判环,因为这道题太简单了,所以我就写这么短的题解. 代码: 1 #include<iostream>

zoj 2193 poj 2585 Window Pains

拓扑排序. 深刻体会:ACM比赛的精髓之处不在于学了某个算法或数据结构,而在于知道这个知识点但不知道这个问题可以用这个知识去解决!一看题目,根本想不到是拓扑排序.T_T...... #include<stdio.h> #include<string.h> #include<math.h> #include<vector> #include<algorithm> using namespace std; int mapp[50][50]; char

POJ 2585 Window Pains 拓扑排序

poj2585 题意: 有一块4X4的屏幕   屏幕中共有9块固定位置的2X2窗口(相互覆盖)  问窗口是否全部显示正常 题解: 判断所有位置的覆盖情况 如果a覆盖b 则构造一条边edge[b][a]=1    最后得到一个图 这个图一定是无环的   如果有环则表示a覆盖b   b又覆盖a 即显示不正常 代码: #include<cstdio> #include<cstring> #include<iostream> using namespace std; int m

字符串截取模板 &amp;&amp; POJ 3450、3080 ( 暴力枚举子串 &amp;&amp; KMP匹配 )

//截取字符串 ch 的 st~en 这一段子串返回子串的首地址 //注意用完需要根据需要最后free()掉 char* substring(char* ch,int st,int en) { int length = en - st + 1; char* pch=ch; char* subch=(char*)malloc(length+1); pch=pch+st; for(int i=0;i<length;i++) subch[i]=*(pch++); subch[length]='\0';

POJ 3187 杨辉三角+枚举排列 好题

如果给出一个由1~n组成的序列,我们可以每相邻2个数求和,得到一个新的序列,不断重复,最后得到一个数sum, 现在输入n,sum,要求输出一个这样的排列,如果有多种情况,输出字典序最小的那一个. 刚开始我是直接搜,tle了 然后就开始找最初的序列和最终的和有什么关系 因为最终的和sum一定是等于若干个a[1],若干个a[2],...,若干个a[n]的和 即sum=p1*a1+p2*a2+...+pn*an 所以我们只要求出数组a的系数,n个p即可. 然后发现,和杨辉三角有很大的关系. 如果杨辉三