您的位置:首页 > 其它

USACO 1.4.2 The Clocks

2013-07-27 13:53 330 查看
原题链接:http://cerberus.delos.com:791/usacoprob2?a=s1DTJaMre3q&S=clocks

先来说一下题目的意思吧!

有九个钟表,标号为A,B,C,D,E,F,G,H,I,然后题目给出九种旋转钟表的方案。比如说1    ABDE是说第一种方案为顺时针旋转A,B,D,E钟表90度,剩下的八种方案意思也是一样的。

题目会给出钟表的初始状态,然后要求你从这九种方案中选出几种方案,然后组合在一起,使得最后旋转的结果为每个钟表都指向12。输出最小的操作顺序。

分析与思路:

      每种方案有四种可能,即被使用0次,1次,2次,3次(因为使用第四次的时候就已经转回原来的样子了),而九个种就形成了4^9=262144种可能,枚举这262144种可能,找出最小的就好了。就是九个for循环来遍历,但是这样可能会超时,所以就得在最内层for循环中进行处理。一种高效的方法是用两个for循环来过滤掉不合格的,第一层for循环代表每一个钟表,内层的for循环代表组合方案的每一种方案,如果一旦组合方案操作在第一个钟表后不能使第一个钟表指向12,则直接否定这种方案,后面几个钟表就不需要在进行这个组合方案了。另外,按这种方法找到的第一种必定是最小的,所以是不需要比较的,找到满足要求的组合方案后直接return就可以了。

源代码:/*
ID: supersnow0622
PROG: clocks
LANG: C++
*/
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int data[9];
int clocks[9];
int method[10][10]={{0},
{0,3,3,0,3,3,0,0,0,0},
{0,3,3,3,0,0,0,0,0,0},
{0,0,3,3,0,3,3,0,0,0},
{0,3,0,0,3,0,0,3,0,0},
{0,0,3,0,3,3,3,0,3,0},
{0,0,0,3,0,0,3,0,0,3},
{0,0,0,0,3,3,0,3,3,0},
{0,0,0,0,0,0,0,3,3,3},
{0,0,0,0,0,3,3,0,3,3}};
int count[10];
int main() {
ofstream fout ("clocks.out");
ifstream fin ("clocks.in");
string str;
for(int i=1;i<=9;i++){
cin>>clocks[i];
if(clocks[i]==12)
clocks[i]=0;
}
for(count[1]=0;count[1]<4;count[1]++)
for(count[2]=0;count[2]<4;count[2]++)
for(count[3]=0;count[3]<4;count[3]++)
for(count[4]=0;count[4]<4;count[4]++)
for(count[5]=0;count[5]<4;count[5]++)
for(count[6]=0;count[6]<4;count[6]++)
for(count[7]=0;count[7]<4;count[7]++)
for(count[8]=0;count[8]<4;count[8]++)
for(count[9]=0;count[9]<4;count[9]++)
{
str="";
for(int i=1;i<=9;i++)
data[i]=clocks[i];
int judge=true;
for(int i=1;i<=9;i++)
{
for(int j=1;j<=9;j++)
{
data[i]+=method[j][i]*count[j];
data[i]%=12;
}
if(data[i]!=0)
{
judge=false;break;
}
}
if(judge)
{
for(int i=1;i<=9;i++)
for(int j=0;j<count[i];j++)
str+=i+'0';
for(int i=0;i<str.length()-1;i++)
cout<<str[i]<<" ";
cout<<str[str.length()-1]<<endl;
return 0;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: