poj 2585 Window Pains 暴力枚举排列

Posted jhcelue

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
} 


以上是关于poj 2585 Window Pains 暴力枚举排列的主要内容,如果未能解决你的问题,请参考以下文章

poj 2585 Window Pains 解题报告

POJ2585 Window Pains 题解 AOV

POJ2585 Window Pains 题解 AOV

POJ 2585 Window Pains 题解

POJ 2585 Window Pains 拓扑排序

POJ 1753 Flip Game (状压+暴力)