题目描述
最近小晨在计概课上学习到二进制之后对其产生了浓厚的兴趣,在每次操作仅能移动相邻的0和1的前提下,她想知道把一个二进制数转换成另一个二进制数的最小操作数。
关于输入
输入共三行:
第一行为一个整数n (0 < n <= 200),代表二进制数的位数
第二行为第一个二进制数的每一位
第三行为第二个二进制数的每一位
关于输出
输出将第一个二进制数转换为第二个二进制数的最少操作数,如果答案不存在,则输出-1
例子输入
7
1 1 0 1 0 0 1
0 1 1 0 0 1 1
例子输出
4
#include <stdio.h>
int calc(char *ch1, char *ch2, int n)
{
int num = 0;
int i = 0, j = 0;
while (i < n && j < n) {
while (i < n && ch1[i] != '0') {
++i;
}
while (j < n && ch2[j] != '0') {
++j;
}
num += (i > j ? i - j : j - i);
++i;
++j;
}
while (i < n && ch1[i] != '0') ++i;
while (j < n && ch2[j] != '0') ++j;
if (i != j) {
return -1;
}
return num;
}
int main(void)
{
int n;
scanf("%d", &n);
char ch1[200] = {0};
char ch2[200] = {0};
scanf("%s", ch1);
scanf("%s", ch2);
printf("%d\n", calc(ch1, ch2, n));
return 0;
}
有用请采纳
#include<stdio.h>
#include<math.h>
/*
使得每一个零或者一归位最少的移动次数应该是, 在移动时保证路线不重叠
考虑向一个方向交换, 即只向后面进行交换操作
*/
int main(){
int n; // 位数
int count1_1, count2_1; // 统计两个数组中1的个数
count1_1 = 0; count2_1 = 0;
int count = 0; // 统计总的需要移动的位数
scanf("%d", &n);
int nums1[n], nums2[n];
for (int i = 0; i < n; i++){
scanf("%d", &nums1[i]);
if (nums1[i] == 1)
count1_1++;
}
for (int i = 0; i < n; i++){
scanf("%d", &nums2[i]);
if (nums2[i] == 1)
count2_1++;
}
if(count1_1 != count2_1)
printf("-1");
else{
int i, j;
i = 0; j = 0;
while (i < n){
if (nums1[i] == 1)
i++;
else{
while(j < n && nums2[j] == 1) // 找到第一个为0的地方
j += 1;
count += abs(j - i);
j += 1;
i += 1;
}
}
}
printf("%d\n", count);
}