您的位置:首页 > 其它

ural 1007 Code Words

2013-07-06 09:49 232 查看
题意:

一个发送机可以通过一条隧道发送一些以二进制代码组成的单词。在其尽头 的接收机可以使用特殊技术恢复到最初的单词。 每个单词最初都由0和1组成。所有的单词最初长度都为N(4<=N<=1000)。当穿 过隧道之后单词可能发生以下几种情况之一:

1.任意(一个)0被1取代

2.任意(一个)符号被删除

3.一个符号(0或1)被插入到任何位置.

我们知道最初的单词都具有以下性质: 有1的位置号的总和是N+1的倍数或是0

分析:分几种情况暴力模拟。

Code:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;

const int maxn=1010;
char str[maxn],tmp[maxn];
int N,len;

bool Multiple(char s[]){
int sum=0;
for(int i=0;i<N;i++){
if(s[i]=='1')
sum+=i+1;
}
if(sum%(N+1)==0) return true;
return false;
}

int main()
{
scanf("%d",&N);
while(scanf("%s",str)!=EOF){
len=strlen(str);
if(len==N){
if(Multiple(str)) printf("%s\n",str);
else {
for(int i=0;i<len;i++){
if(str[i]=='1'){
for(int j=0;j<len;j++){
if(j==i){
tmp[j]='0';
continue;
}
tmp[j]=str[j];
}
tmp[len]='\0';
if(Multiple(tmp)){
printf("%s\n",tmp);
break;
}
}
}
}
}else if(len<N){
for(int i=0;i<N;i++){
int idx=0,j;
for(j=0;j<i;j++){
tmp[idx]=str[j];
idx++;
}
tmp[idx++]='0';
for(;j<len;j++){
tmp[idx]=str[j];
idx++;
}
tmp[idx]='\0';
if(Multiple(tmp)){
printf("%s\n",tmp);
break;
}
idx=0;
for(j=0;j<i;j++){
tmp[idx]=str[j];
idx++;
}
tmp[idx++]='1';
for(;j<len;j++){
tmp[idx]=str[j];
idx++;
}
tmp[idx]='\0';
if(Multiple(tmp)){
printf("%s\n",tmp);
break;
}
}
}else if(len>N){
for(int i=0;i<len;i++){
int idx=0;
for(int j=0;j<len;j++){
if(j==i) continue;
tmp[idx++]=str[j];
}
tmp[idx]='\0';
if(Multiple(tmp)){
printf("%s\n",tmp);
break;
}
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: