通信题杂记

很早就知道UOJ454了。

今天终于决定写。

然后发现通信题的运行调试很麻烦,在各种尝试后终于找到了可以正常运行的方法,而且不需要外部辅助。

把读入写成这样:

char read(){
    char re=getchar();
    for(;re==-1;re=getchar());
    return(re);
}

这样读完就会自动等待对面输出。

然后文操这么写:

//Alice
system("del B.out");            //清空文件
freopen("A.out","w",stdout);    //创建标准输出文件
while(access("B.out",0)==-1);   
//等待对方创建标准输出文件,否则在无文件的情况下会直接卡死
freopen("B.out","r",stdin);     //重定向标准输入,这一行的位置必须位于确认文件存在之后
//Bob
system("del A.out");            //同上。因为两个程序会先后开,所以先开的那个会把文件占用,后开的删不掉
freopen("B.out","w",stdout);
while(access("A.out",0)==-1);
freopen("A.out","r",stdin);

需要使用 #include<unistd.h> 头文件。

然后就可以正常运行了。

附UOJ454 AC代码:

//Alice
#include<iostream>
#include<unistd.h>
#include<cstdlib>
#include<fstream>
#include<string>
using namespace std;
ifstream fin;
char read(){
    char re=getchar();
    for(;re==-1;re=getchar());
    return(re-48);
}
void write(int ch){
    putchar(ch+48);
    fflush(stdout);
}
int n,m,k=0,te;
bool s[2010],need[2010];
char c;
int main(){
//  #define DEBUG
#ifdef DEBUG
    system("del B.out");
    freopen("A.out","w",stdout);
    while(access("B.out",0)==-1);
    freopen("B.out","r",stdin);
#endif
    
    fin.open("alice.in");
    fin>>n>>m;
    te=(n<<1)/3;
    for(int i=1;i<=n<<1;++i){
        fin>>c;
        s[i]=c-48;
    }
    k=read()<<1;k+=read();
    for(int i=1;i<=te;i++){
        write(s[i+k*te]);
    }
    for(int i=1;i<=te;i++){
        if(read()){
            write(s[i+(k?0:te)]);
        }
    }
    for(int i=1;i<=te;i++){
        if(read()){
            write(s[i+(k<2?te<<1:te)]);
        }
    }
    for(int i=te*3+1;i<=n<<1;i++){
        write(s[i]);
    }
    return(0);
}
//Bob
#include<iostream>
#include<unistd.h>
#include<fstream>
#include<string>
using namespace std;
ifstream fin;
char read(){
    char re=getchar();
    for(;re==EOF;re=getchar());
    return(re-48);
}
void write(int ch){
    putchar(ch+48);
    fflush(stdout);
}
ofstream fout;
int n,m,te,a[2010],s[3],k;
bool p[2010],ans[2010];
int main(){
//  #define DEBUG
    #ifdef DEBUG
    system("del A.out");
    freopen("B.out","w",stdout);
    while(access("A.out",0)==-1);
    freopen("A.out","r",stdin);
    #endif
    
    fin.open("bob.in");
    fout.open("bob.out");
    fin>>n>>m;
    te=(n<<1)/3;
    for(int i=1;i<=n;++i){
        fin>>a[i];
        p[a[i]]=1;
    }
    for(int i=1;i<=te;i++){
        s[0]+=p[i];s[1]+=p[i+te];s[2]+=p[i+(te<<1)];
    }
    k=s[0]>s[1]?0:1;
    k=s[k]>s[2]?k:2;
    write(k>>1);write(k&1);
    for(int i=1;i<=te;i++){
        ans[i+k*te]=read();
    }
    for(int i=1;i<=te;i++){
        write(p[i+(k?0:te)]);
        if(p[i+(k?0:te)]){
            ans[i+(k?0:te)]=read();
        }
    }
    for(int i=1;i<=te;i++){
        write(p[i+(k<2?te<<1:te)]);
        if(p[i+(k<2?te<<1:te)]){
            ans[i+(k<2?te<<1:te)]=read();
        }
    }
    for(int i=te*3+1;i<=n<<1;i++){
        ans[i]=read();
    }
    for(int i=1;i<=n;i++){
        fout<<ans[a[i]];
    }
    return(0);
}
原文地址:https://www.cnblogs.com/groundwater/p/14284443.html