POJ 1166&IOI 1994 The blocks 暴力枚举 解题报告
2014-08-27 16:41
591 查看
题目大意:
给定3*3的矩阵时钟的初始位置(0,1,2,3),和9种移动的方式,每次移动可以使时钟值+1,求输出当所有时钟都为0的时候的字典序移动方式。
题目分析:
这道题拿到题目有一些迷惑,觉得要用搜索,但其实不需要,对于每一个移动的操作,我们不会使用超过三次,如果4次以上都等价于1-3次,所以枚举的量就降下来了,并且字典序输出的话,用枚举的话,找到最小值就break,正好是满足字典序的。
代码如下(附带注释):
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define N 10
using namespace std;
int a
,tem
,t
;//tem[i]表示第i个钟表经过操作后的位置,a[i]是初始位置,t[i]是第i个操作的操作次数
int main()
{
for(int i=1;i<=9;i++)
scanf("%d",&a[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]++)
{
tem[1]=(a[1]+t[1]+t[2]+t[4])%4;
tem[2]=(a[2]+t[1]+t[2]+t[3]+t[5])%4;
tem[3]=(a[3]+t[2]+t[3]+t[6])%4;
tem[4]=(a[4]+t[1]+t[4]+t[5]+t[7])%4;
tem[5]=(a[5]+t[1]+t[3]+t[5]+t[7]+t[9])%4;
tem[6]=(a[6]+t[3]+t[5]+t[6]+t[9])%4;
tem[7]=(a[7]+t[4]+t[7]+t[8])%4;
tem[8]=(a[8]+t[5]+t[7]+t[8]+t[9])%4;
tem[9]=(a[9]+t[6]+t[8]+t[9])%4;
if(tem[1]+tem[2]+tem[3]+tem[4]+tem[5]+tem[6]+tem[7]+tem[8]+tem[9]==0)
{
for(int i=0;i<t[1];i++) printf("1 ");
for(int i=0;i<t[2];i++) printf("2 ");
for(int i=0;i<t[3];i++) printf("3 ");
for(int i=0;i<t[4];i++) printf("4 ");
for(int i=0;i<t[5];i++) printf("5 ");
for(int i=0;i<t[6];i++) printf("6 ");
for(int i=0;i<t[7];i++) printf("7 ");
for(int i=0;i<t[8];i++) printf("8 ");
for(int i=0;i<t[9];i++) printf("9 ");
break;
}
}
//while(1);
return 0;
}
给定3*3的矩阵时钟的初始位置(0,1,2,3),和9种移动的方式,每次移动可以使时钟值+1,求输出当所有时钟都为0的时候的字典序移动方式。
题目分析:
这道题拿到题目有一些迷惑,觉得要用搜索,但其实不需要,对于每一个移动的操作,我们不会使用超过三次,如果4次以上都等价于1-3次,所以枚举的量就降下来了,并且字典序输出的话,用枚举的话,找到最小值就break,正好是满足字典序的。
代码如下(附带注释):
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#define N 10
using namespace std;
int a
,tem
,t
;//tem[i]表示第i个钟表经过操作后的位置,a[i]是初始位置,t[i]是第i个操作的操作次数
int main()
{
for(int i=1;i<=9;i++)
scanf("%d",&a[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]++)
{
tem[1]=(a[1]+t[1]+t[2]+t[4])%4;
tem[2]=(a[2]+t[1]+t[2]+t[3]+t[5])%4;
tem[3]=(a[3]+t[2]+t[3]+t[6])%4;
tem[4]=(a[4]+t[1]+t[4]+t[5]+t[7])%4;
tem[5]=(a[5]+t[1]+t[3]+t[5]+t[7]+t[9])%4;
tem[6]=(a[6]+t[3]+t[5]+t[6]+t[9])%4;
tem[7]=(a[7]+t[4]+t[7]+t[8])%4;
tem[8]=(a[8]+t[5]+t[7]+t[8]+t[9])%4;
tem[9]=(a[9]+t[6]+t[8]+t[9])%4;
if(tem[1]+tem[2]+tem[3]+tem[4]+tem[5]+tem[6]+tem[7]+tem[8]+tem[9]==0)
{
for(int i=0;i<t[1];i++) printf("1 ");
for(int i=0;i<t[2];i++) printf("2 ");
for(int i=0;i<t[3];i++) printf("3 ");
for(int i=0;i<t[4];i++) printf("4 ");
for(int i=0;i<t[5];i++) printf("5 ");
for(int i=0;i<t[6];i++) printf("6 ");
for(int i=0;i<t[7];i++) printf("7 ");
for(int i=0;i<t[8];i++) printf("8 ");
for(int i=0;i<t[9];i++) printf("9 ");
break;
}
}
//while(1);
return 0;
}
相关文章推荐
- HOJ1717 & POJ 1923解题报告
- POJ-3087 Shuffle'm Up 解题报告(陈小宾)
- POJ 3273 Monthly Expense 解题报告(二分枚举)
- POJ1042解题报告,很简单的贪心枚举
- poj&nbsp;1001&nbsp;解题报告
- POJ 1060 Post Office 分析&解题报告
- POJ 3126 Prime Path 解题报告(BFS & 双向BFS)
- POJ 1166 The Clocks 解题报告(高斯消元法 & 逆矩阵)
- POJ 3159 Candies 解题报告(Dijkstra & SPFA) 及 双向Dijkstra性能测试
- 【原创】POJ 1703 && RQNOJ 能量项链解题报告
- poj 2367 & poj 1094 分析&解题报告(拓扑排序入门)
- POJ 2002 Squares 解题报告(哈希 开放寻址 & 链式)
- hdu 1172 猜数字 解题报告<暴力枚举>
- POJ 3318 Matrix Multiplication 解题报告 (随机化 & 矩阵性质)
- POJ1013解题报告 暴力搜索
- POJ-3087 Shuffle'm Up 解题报告
- POJ 1166解题报告
- poj 1166 The Clocks 暴力枚举
- POJ 2429 GCD & LCM Inverse 解题报告(大数因式分解)
- 【解题报告】POJ 2449 Remmarguts' Date -- 有向图第k短路(有重边)