POJ1166 The Clocks [枚举]

这题蛮有意思,不知道怎么分类到高斯了, 应该是一道枚举

思路很赞,不多说,看代码

c那个数组很容易初始化错误呢

最后的输出有点搞人,不过也可能不用特别注意最后一个空格

#include <cstdio>
#include <cstring>
#include <iostream>
#include <cstdlib>
using namespace std;
int c[10][10]={
					{0,0,0,0,0,0,0,0,0,0},
					{0,1,1,0,1,1,0,0,0,0},
					{0,1,1,1,0,0,0,0,0,0},
					{0,0,1,1,0,1,1,0,0,0},
					{0,1,0,0,1,0,0,1,0,0},
					{0,0,1,0,1,1,1,0,1,0},
					{0,0,0,1,0,0,1,0,0,1},
					{0,0,0,0,1,1,0,1,1,0},
					{0,0,0,0,0,0,0,1,1,1},
					{0,0,0,0,0,1,1,0,1,1}
					};
void copy(int* tmp,int* num)
{
	for(int i=1;i<=9;i++)
		tmp[i]=num[i];
}
void add(int* tmp,int i,int ti)
{
	for(int ii=1;ii<=9;ii++)
	{
		tmp[ii]+=c[i][ii]*ti;
		tmp[ii]%=4;
	}
}
bool check(int* tmp)
{
	for(int i=1;i<=9;i++)
	{
		if(tmp[i]!=0)
			return false;
	}
	return true;
}
int sum(int* t)
{
	int s=0;
	for(int i=1;i<=9;i++)
		s+=t[i];
	return s;
}
int num[10];
int tmp[10];
int t[10];
int ans[10];
int minn=9999999;
int main()
{
	for(int i=1;i<=9;i++)
		cin>>num[i];
	for(t[1]=0;t[1]<=3;t[1]++)
		for(t[2]=0;t[2]<=3;t[2]++)
			for(t[3]=0;t[3]<=3;t[3]++)
				for(t[4]=0;t[4]<=3;t[4]++)
					for(t[5]=0;t[5]<=3;t[5]++)
						for(t[6]=0;t[6]<=3;t[6]++)
							for(t[7]=0;t[7]<=3;t[7]++)
								for(t[8]=0;t[8]<=3;t[8]++)
									for(t[9]=0;t[9]<=3;t[9]++)
									{
										copy(tmp,num);
										for(int i=1;i<=9;i++)
											add(tmp,i,t[i]);
										if(!check(tmp))
											continue;
										else if(sum(t)<minn)
										{
											minn=sum(tmp);
											copy(ans,t);
										}
									}
	int last=0;
	for(int i=1;i<=9;i++)
	{
		if(ans[i])
			last=i;
	}
	for(int i=1;i<last;i++)
	{
		for(int k=1;k<=ans[i];k++)
		{
			cout<<i<<' ';
		}
	}
	for(int k=1;k<ans[last];k++)
		cout<<last<<' ';
	cout<<last<<'\n';
	return 0;
}

POJ1166 The Clocks [枚举],布布扣,bubuko.com

时间: 2024-08-10 23:29:40

POJ1166 The Clocks [枚举]的相关文章

poj练习题的方法

poj1010--邮票问题 DFSpoj1011--Sticks dfs + 剪枝poj1020--拼蛋糕poj1054--The Troublesome Frogpoj1062--昂贵的聘礼poj1077--Eightpoj1084--Square Destroyerpoj1085--Triangle War(博弈,極大極小搜索+alpha_beta剪枝)poj1088--滑雪poj1129--Channel Allocation 着色问题 dfspoj1154--letters (dfs)p

POJ 搜索题集

poj1010--邮票问题 DFS poj1011--Sticks dfs + 剪枝 poj1020--拼蛋糕 poj1054--The Troublesome Frog poj1062--昂贵的聘礼 poj1077--Eight poj1084--Square Destroyer poj1085--Triangle War(博弈,極大極小搜索+alpha_beta剪枝) poj1088--滑雪 poj1129--Channel Allocation 着色问题 dfs poj1154--lett

【算法学习笔记】69. 枚举法 字典序处理 SJTU OJ 1047 The Clocks

我们发现这个题里每一种“移动套餐”用的次数只有0,1,2,3 是有效的,4和0是一样的. 所以我们开一个数组rot[10]来记录这9个套餐分别用了多少次. 字典序的处理和我们的枚举顺序息息相关. 我们从 000000000 到 333333333 来枚举的话,第一个符合条件的结果当然就是所有答案中字典序最小的一个了. 枚举这个排列我们需要用9个for,当然也可以用递归来实现,不过我还是喜欢视觉感比较强烈的9个for.... 在每一种排列下,我们需要通过这些套餐的方案来计算临时结果path. 然后

C# 枚举

一.在学习枚举之前,首先来听听枚举的优点. 1.枚举能够使代码更加清晰,它允许使用描述性的名称表示整数值. 2.枚举使代码更易于维护,有助于确保给变量指定合法的.期望的值. 3.枚举使代码更易输入. 二.枚举说明 1.简单枚举 枚举使用enum关键字来声明,与类同级.枚举本身可以有修饰符,但枚举的成员始终是公共的,不能有访问修饰符.枚举本身的修饰符仅能使用public和internal. 枚举是值类型,隐式继承自System.Enum,不能手动修改.System.Enum本身是引用类型,继承自S

C++ 枚举定义

我们在平常的编程中,时常需要为一些属性定义一组可以选择的值,比如文件打开的状态可能会有三种:输入 输出和追加 我们一般情况下记录这些状态是让每一个状态和一个常数相对应   比如 1 const int input=0; 2 const int output=1; 3 const int append=2; 这个方法虽然也是可以得,不过它有一个明显的缺点就是    没有指出这些值是相关联的 而C++中的  枚举  提供了一种替代的方法   不但可以定义常数集   还可以将其聚集成组    如下:

java 枚举常用操作

在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. Java代码 public enum Color { } JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强. Java代码 enum Signal { } public class TrafficLight { public void change() {

java 枚举的应用

使用枚举的方式 实现上一篇中介绍的例子:并增加功能,输出今天执行的内容: import java.util.Calendar;import java.util.Date; /** * 周 的枚举 */public enum Day { WORK(1, 2, 3, 4, 5) { @Override public void doThing() { System.out.println("工作..."); } },//工作日 STA(6) { @Override public void d

C#枚举类型的常用操作总结

枚举类型是定义了一组"符号名称/值"配对.枚举类型是强类型的.每个枚举类型都是从system.Enum派生,又从system.ValueType派生,而system.ValueType又从system.Object派生,所以枚举类型是指类型. 编译枚举类型时,C#编译器会把每个符号转换成类型的一个常量字段.C#编译器将枚举类型视为基元类型. 1.获取枚举列表:         /// <summary>         /// 获取枚举列表         /// <

Swift学习之位移枚举的按位或运算

在OC里面我们经常遇到一些枚举值可以多选的,需要用或运算来把这些枚举值链接起来,这样的我们称为位移枚举,但是在swift语言里面却不能这么做,下面来讲解一下如何在swift里面使用 OC的位移枚举的区分 //位移枚举typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) { UIViewAutoresizingNone = 0, UIViewAutoresizingFlexibleLeftMargin = 1 << 0, UIViewAutores