001:特殊密码锁
总时间限制: 1000ms 内存限制: 1024kB
描述
有一种特殊的二进制密码锁,由n个相连的按钮组成(n<30),按钮有凹/凸两种状态,用手按按钮会改变其状态。
然而让人头疼的是,当你按一个按钮时,跟它相邻的两个按钮状态也会反转。当然,如果你按的是最左或者最右边的按钮,该按钮只会影响到跟它相邻的一个按钮。
当前密码锁状态已知,需要解决的问题是,你至少需要按多少次按钮,才能将密码锁转变为所期望的目标状态。
输入
两行,给出两个由0、1组成的等长字符串,表示当前/目标密码锁状态,其中0代表凹,1代表凸。
输出
至少需要进行的按按钮操作次数,如果无法实现转变,则输出impossible。
样例输入
011
000
样例输出
1
核心:一旦确定a的状态,就可以用c来调整b的状态从而不会影响到a,本题看似需要枚举2的n次方次,实际上只用枚举两次就够了。
code:
#include<iostream>
#include<cstring>
using namespace std;
int fz(char k)
{
if (k == '1') return '0';
return '1';
}
int main()
{
char a[31], b[31], c[31];
cin >> a >> b;
int cnt = 0,cntt=1;
int m = strlen(a);
strcpy(c, a);
int i;
for (i = 0; i < m; i++)
{
if (a[i] != b[i])
{
cnt++;
if (i < m - 2)
{
a[i]=fz(a[i]);
a[i+1]=fz(a[i + 1]);
a[i+2]=fz(a[i + 2]);
}
else
{
a[i+1]=fz(a[i + 1]);
a[i]=fz(a[i]);
}
}
}
c[0]=fz(c[0]);
c[1]=fz(c[1]);
for (i = 0; i < m; i++)
{
if (c[i] != b[i])
{
cntt++;
if (i < m - 2)
{
c[i]=fz(c[i]);
c[i+1]=fz(c[i + 1]);
c[i+2]=fz(c[i + 2]);
}
else
{
c[i]=fz(c[i]);
c[i+1]=fz(c[i + 1]);
}
}
}
if (strcmp(a, b)==0)
cout << cnt;
else if (strcmp(c, b)==0)
cout << cntt;
else
cout << "impossible";
return 0;
}
002:拨钟问题
总时间限制: 1000ms 内存限制: 65536kB
描述
有9个时钟,排成一个3*3的矩阵。
现在需要用最少的移动,将9个时钟的指针都拨到12点的位置。共允许有9种不同的移动。如下表所示,每个移动会将若干个时钟的指针沿顺时针方向拨动90度。
移动 影响的时钟
1 ABDE
2 ABC
3 BCEF
4 ADG
5 BDEFH
6 CFI
7 DEGH
8 GHI
9 EFHI
输入
9个整数,表示各时钟指针的起始位置,相邻两个整数之间用单个空格隔开。其中,0=12点、1=3点、2=6点、3=9点。
输出
输出一个最短的移动序列,使得9个时钟的指针都指向12点。按照移动的序号从小到大输出结果。相邻两个整数之间用单个空格隔开。
样例输入
3 3 0
2 2 2
2 1 2
样例输出
4 5 8 9
code:
#include <stdio.h>
int main() {
int t[9] = { 0 };
int i, i1, i2, i3, i4, i5, i6, i7, i8, i9;
for (i = 0; i<9; i++) {
scanf("%d", &t[i]);
}
int min = 40;
int r[9] = { 0 };
for (i1 = 0; i1<4; i1++) {
for (i2 = 0; i2<4; i2++) {
for (i3 = 0; i3<4; i3++) {
for (i4 = 0; i4<4; i4++) {
for (i5 = 0; i5<4; i5++) {
for (i6 = 0; i6<4; i6++) {
for (i7 = 0; i7<4; i7++) {
for (i8 = 0; i8<4; i8++) {
for (i9 = 0; i9<4; i9++) {
if ((i1 + i2 + i4 + t[0]) % 4 == 0 && (i1 + i2 + i3 + i5 + t[1]) % 4 == 0
&& (i2 + i3 + i6 + t[2]) % 4 == 0 && (i1 + i4 + i5 + i7 + t[3]) % 4 == 0
&& (i1 + i3 + i5 + i7 + i9 + t[4]) % 4 == 0 && (i3 + i5 + i6 + i9 + t[5]) % 4 == 0
&& (i4 + i7 + i8 + t[6]) % 4 == 0 && (i5 + i7 + i8 + i9 + t[7]) % 4 == 0
&& (i6 + i8 + i9 + t[8]) % 4 == 0) {
int sum = i1 + i2 + i3 + i4 + i5 + i6 + i7 + i8 + i9;
if (sum < min) {
min = sum;
r[0] = i1;
r[1] = i2;
r[2] = i3;
r[3] = i4;
r[4] = i5;
r[5] = i6;
r[6] = i7;
r[7] = i8;
r[8] = i9;
}
}
}
}
}
}
}
}
}
}
}
int j;
for (j = 0; j<9; j++) {
while (r[j] != 0) {
printf("%d ", j + 1);
r[j] --;
}
}
return 0;
}