POJ 1166 The Clocks (爆搜 || 高斯消元)

题目链接

题意:

输入提供9个钟表的位置(钟表的位置只能是0点、3点、6点、9点,分别用0、1、2、3)表示。而题目又提供了9的步骤表示可以用来调正钟的位置,例如1 ABDE表示此步可以在第一、二、四、五个钟调正,如原来是0点,那么调正后为3点。问经过那些步骤可以导致9个钟的位置都在0点。

分析:

这个本来是一个高斯消元的题目,但是 听说周期4不是素数, 求解过程中不能进行取余。因为取余可能导致解集变大。

不过也有用高斯消元做的,下面是用高斯消元的分析

Discuss也有人讨论了,4不是质数,求解过程中不能模4,不一定有解的问题。按照我的理解,题目既然说了有唯一解,就不用考虑这个问题了。

另外,寻找当前列的对应行时不能选绝对值最大的,会WA。具体原因不详

这个题也可以用逆矩阵做,下面有代码,代码来自:http://blog.csdn.net/sf____/article/details/9863927

爆搜的特点:

操作对环境的改变是无序的,每个操作都会影响到周围的状态。
同时每一种操作都有周期性限制,也即最多需要几次操作,多于这个次数产生循环。

这里,有4种循环的状态,因此每个移动操作顶多使用3次。

爆搜代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <cmath>
 6 #include <algorithm>
 7 #define LL __int64
 8 const int maxn = 70+10;
 9 const int INF = 1<<28;
10 using namespace std;
11
12 int main()
13 {
14       int x,a[10],i[10],j[10];
15       for(x=1; x<=9; x++)
16       scanf("%d",&a[x]);
17       for(i[1]=0; i[1]<=3; i[1]++)
18       for(i[2]=0; i[2]<=3; i[2]++)
19       for(i[3]=0; i[3]<=3; i[3]++)
20       for(i[4]=0; i[4]<=3; i[4]++)
21       for(i[5]=0; i[5]<=3; i[5]++)
22       for(i[6]=0; i[6]<=3; i[6]++)
23       for(i[7]=0; i[7]<=3; i[7]++)
24       for(i[8]=0; i[8]<=3; i[8]++)
25       for(i[9]=0; i[9]<=3; i[9]++)
26       {
27             j[1]=(a[1]+i[1]+i[2]+i[4])%4;
28             j[2]=(a[2]+i[1]+i[2]+i[3]+i[5])%4;
29             j[3]=(a[3]+i[2]+i[3]+i[6])%4;
30             j[4]=(a[4]+i[1]+i[4]+i[5]+i[7])%4;
31             j[5]=(a[5]+i[1]+i[3]+i[5]+i[7]+i[9])%4;
32             j[6]=(a[6]+i[3]+i[5]+i[6]+i[9])%4;
33             j[7]=(a[7]+i[4]+i[7]+i[8])%4;
34             j[8]=(a[8]+i[5]+i[7]+i[8]+i[9])%4;
35             j[9]=(a[9]+i[6]+i[8]+i[9])%4;
36             if(j[1]+j[2]+j[3]+j[4]+j[5]+j[6]+j[7]+j[8]+j[9]==0)
37             {
38                     for(x=0; x<i[1]; x++) printf("1 ");
39                     for(x=0; x<i[2]; x++) printf("2 ");
40                     for(x=0; x<i[3]; x++) printf("3 ");
41                     for(x=0; x<i[4]; x++) printf("4 ");
42                     for(x=0; x<i[5]; x++) printf("5 ");
43                     for(x=0; x<i[6]; x++) printf("6 ");
44                     for(x=0; x<i[7]; x++) printf("7 ");
45                     for(x=0; x<i[8]; x++) printf("8 ");
46                     for(x=0; x<i[9]; x++) printf("9 ");
47                     cout<<endl;
48             }
49       }
50     return 0;
51 }
 1 // 逆矩阵
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5
 6 int a[9][9]={
 7 {3,2,3,2,2,1,3,1,0,},
 8 {3,3,3,3,3,3,2,0,2,},
 9 {3,2,3,1,2,2,0,1,3,},
10 {3,3,2,3,3,0,3,3,2,},
11 {3,2,3,2,1,2,3,2,3,},
12 {2,3,3,0,3,3,2,3,3,},
13 {3,1,0,2,2,1,3,2,3,},
14 {2,0,2,3,3,3,3,3,3,},
15 {0,1,3,1,2,2,3,2,3,}};
16
17 int x[9];
18 int res[9];
19
20 int main()
21 {
22     for(int i=0;i<9;i++)
23     {
24         scanf("%d",x+i);
25         x[i]=(4-x[i])%4;
26     }
27
28     for(int i=0;i<9;i++)
29         for(int j=0;j<9;j++)
30             res[i]+=a[i][j]*x[j];
31
32     for(int i=0;i<9;i++) while(res[i]%4 && res[i]--)
33         printf("%d ",i+1);
34     puts("");
35 }

POJ 1166 The Clocks (爆搜 || 高斯消元),布布扣,bubuko.com

时间: 2024-10-10 14:39:20

POJ 1166 The Clocks (爆搜 || 高斯消元)的相关文章

POJ 1681 Painter&#39;s Problem (高斯消元)

题目链接 题意: 一个n*n 的木板 ,每个格子 都 可以 染成 白色和黄色,( 一旦我们对也个格子染色 ,他的上下左右 都将改变颜色): 给定一个初始状态 , 求将 所有的 格子 染成黄色 最少需要染几次?  若 不能 染成 输出 inf. 分析: 和1222差不多,唯一的区别是这个题还要求 最短的步数,其实只需要枚举一下最后的x[][]是否为1,即是否需要按下, 由于只有无解或者解唯一,因为按的顺序是没有影响的,所以只要是有解一定唯一,而且最短的情况是每个格子只按一次, 因为按两次以后就变为

POJ 1681 Painter&#39;s Problem 【高斯消元 二进制枚举】

任意门:http://poj.org/problem?id=1681 Painter's Problem Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7667   Accepted: 3624 Description There is a square wall which is made of n*n small square bricks. Some bricks are white while some bric

POJ 1222 EXTENDED LIGHTS OUT(高斯消元解XOR方程组)

http://poj.org/problem?id=1222 题意:现在有5*6的开关,1表示亮,0表示灭,按下一个开关后,它上下左右的灯泡会改变亮灭状态,要怎么按使得灯泡全部处于灭状态,输出方案,1表示按,0表示不按. 思路:每个开关最多只按一次,因为按了2次之后,就会抵消了. 可以从结果出发,也就是全灭状态怎么按能变成初始状态. 用3*3来举个例子,$X\left ( i,j \right )$表示这些开关是按还是不按,那么对于第一个开关,对它有影响的就只有2.4这两个开关,所以它的异或方程

POJ 1222 EXTENDED LIGHTS OUT(高斯消元)

[题目链接] http://poj.org/problem?id=1222 [题目大意] 给出一个6*5的矩阵,由0和1构成,要求将其全部变成0,每个格子和周围的四个格子联动,就是说,如果一个格子变了数字,周围四格都会发生变化,变化即做一次与1的异或运算,输出每个格子的操作次数. [题解] 高斯消元练手题,对于每个格子的最终情况列一个方程,一共三十个方程三十个未知数,用高斯消元求解即可. [代码] #include <cstdio> #include <algorithm> #in

【POJ】1830 开关问题(高斯消元)

http://poj.org/problem?id=1830 高斯消元无解的条件:当存在非法的左式=0而右式不等于0的情况,即为非法.这个可以在消元后,对没有使用过的方程验证是否右式不等于0(此时因为前边消元一定会使得后边的方程左式为0) 高斯消元自由变元:自由变元就是当这些未知量一旦确定,整个方程就确定了.但是这些量是未知的.(例如x+y=5,自由变元就是1,因为无论是x还是y确定,另一个就能唯一确定),而答案要求的是方案,那么显然因为自由变元是可以随便赋值的,而这些值只有2个,开和不开,那么

poj 1681 Painter&amp;#39;s Problem(高斯消元)

http://poj.org/problem? id=1681 求最少经过的步数使得输入的矩阵全变为y. 思路:高斯消元求出自由变元.然后枚举自由变元,求出最优值. 注意依据自由变元求其它解及求最优值的方法. #include <stdio.h> #include <algorithm> #include <set> #include <map> #include <vector> #include <math.h> #include

【POJ】2947 Widget Factory(高斯消元)

http://poj.org/problem?id=2947 各种逗啊..还好1a了.. 题意我就不说了,百度一大把. 转换为mod的方程组,即 (x[1,1]*a[1])+(x[1,2]*a[2])+...+(x[1,n]*a[n])=x[1, n+1] (mod m) (x[2,1]*a[1])+(x[2,2]*a[2])+...+(x[2,n]*a[n])=x[2, n+1] (mod m) ... (x[n,1]*a[1])+(x[n,2]*a[2])+...+(x[n,n]*a[n])

poj 3185 The Water Bowls(高斯消元)

The Water Bowls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4352   Accepted: 1721 Description The cows have a line of 20 water bowls from which they drink. The bowls can be either right-side-up (properly oriented to serve refreshing

POJ EXTENDED LIGHTS OUT 1222【高斯消元】

Language: Default EXTENDED LIGHTS OUT Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 7672   Accepted: 4996 Description In an extended version of the game Lights Out, is a puzzle with 5 rows of 6 buttons each (the actual puzzle has 5 row