POJ 1166&IOI 1994 The blocks 暴力枚举 解题报告

题目大意:


给定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[N],tem[N],t[N];//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;
} 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值