TZC 的OJ写SPJ基本格式是(主要思想分析答案是否合法): //SPJ代码:(直接编译连接生成的文件直接放到OJ即可无需修改) #include <stdio.h> #include <stdlib.h> #define ACCEPT 1 #define WRONG_ANSWER 0 int res=3;//表示数据检测后的状态 2表示格式错误 小于2表示答案错误 3表示ACCEPT //通过对二进制位的标记去处理 当格式错误的时候就 res=res&2; 当答案错误的时候res=res&1; //当答案和格式都错误 res=res&0; void check()//判断数据是否合法 { } int main(int argc, char *argv[]) { /*本地调试 FILE* fp1 = fopen("d:/data1.in","r");//标准输入文件 FILE* fp2 = fopen("d:/userdata.in","r");//用户产生的答案数据文件 FILE* fp3 = fopen("d:/data1.out","r");//标准的答案文件 */ //oJ里的写法 FILE* fp1 = fopen("../input/data1.in","r");//标准输入 FILE* fp2 = fopen(argv[1],"r");//选手的输出结果获取 if() { return ACCEPT; } else { return WRONG_ANSWER; } return 0; } 为我们学校写的第一个SPJ程序,刚开始写遇到很多问题 文件操作的问题主要。。。后来终于出来了~~~·记录下 以后写了可以参考下。。。。写的不好不要见怪啊~~~~~ #include<stdio.h> #include<string.h> #define maxn 30 void geshi(char d[]); int r,c,dir[4][2]={0,1,1,0,0,-1,-1,0};//顺序东 南 西 北 int res; typedef struct { int x,y; }node; node s,e,ps; void pan(char d[]); char map[maxn][maxn]; int check(node tt) { return tt.x>=0&&tt.x<r&&tt.y>=0&&tt.y<c&&map[tt.x][tt.y]!='#'; } node que[maxn*maxn+100]; //判断数据是否正确语句 void data_check(char d[])//判断是否可以到达T { int i; node tt,pt; geshi(d); if(!res){return;} for(i=0;d[i]!='/0';i++) { //人和箱子一起 if(d[i]=='E'||d[i]=='S'||d[i]=='W'||d[i]=='N') { if(d[i]=='E') { pt.x=ps.x+dir[0][0]; pt.y=ps.y+dir[0][1]; tt.x=s.x+dir[0][0]; tt.y=s.y+dir[0][1]; } if(d[i]=='S') { pt.x=ps.x+dir[1][0]; pt.y=ps.y+dir[1][1]; tt.x=s.x+dir[1][0]; tt.y=s.y+dir[1][1]; } if(d[i]=='W') { pt.x=ps.x+dir[2][0]; pt.y=ps.y+dir[2][1]; tt.x=s.x+dir[2][0]; tt.y=s.y+dir[2][1]; } if(d[i]=='N') { pt.x=ps.x+dir[3][0]; pt.y=ps.y+dir[3][1]; tt.x=s.x+dir[3][0]; tt.y=s.y+dir[3][1]; } s=tt; ps=pt; if(!check(tt)) { res=res&1;return; } } else { //人走 if(d[i]=='e') { pt.x=ps.x+dir[0][0]; pt.y=ps.y+dir[0][1]; } if(d[i]=='s') { pt.x=ps.x+dir[1][0]; pt.y=ps.y+dir[1][1]; } if(d[i]=='w') { pt.x=ps.x+dir[2][0]; pt.y=ps.y+dir[2][1]; } if(d[i]=='n') { pt.x=ps.x+dir[3][0]; pt.y=ps.y+dir[3][1]; } ps=pt; if(!check(pt)) { res=res&1;return; } } } if(map[tt.x][tt.y]!='T'){res=res&1;return;} } void geshi(char d[]) { int i=0; //判断答案中是否有非法数据 for(i=0;d[i]!='/0';i++) { if(!(d[i]=='N'||d[i]=='S'||d[i]=='W'||d[i]=='E'||d[i]=='n'||d[i]=='s'||d[i]=='e'||d[i]=='w')) { res=0;return; } } } //从文件读出一行数据遇到换行结束读取 void mfgets(FILE *fp,char tmp[]) { int i=0; char ch; while((ch = fgetc(fp))!='/n') { tmp[i++]=ch; } tmp[i]='/0'; } int main(int argc,char *argv[]) { FILE* fp1 = fopen("d:/data1.in","r");//标准输入文件 FILE* fp2 = fopen("d:/userdata.in","r");//用户产生的答案数据文件 FILE* fp3 = fopen("d:/data1.out","r");//标准的答案文件 int i,j; res=3;//3表示格式与数据完全符合 char pre_userdata[105],userdata[maxn*maxn+100],standard_data[maxn*maxn+100],pre_st_data[maxn*maxn]; while(fscanf(fp1,"%d %d",&r,&c),r||c) { //获取标准输入数据 for(i=0;i<r;i++) { fgetc(fp1); for(j=0;j<c;j++) { fscanf(fp1,"%c",&map[i][j]); if(map[i][j]=='T'){e.x=i;e.y=j;} if(map[i][j]=='B'){s.x=i;s.y=j;} if(map[i][j]=='S'){ps.x=i;ps.y=j;} } } //读用户产生的答案数据 mfgets(fp2,pre_userdata); mfgets(fp2,userdata); //读标准文件的输出答案 mfgets(fp3,pre_st_data); mfgets(fp3,standard_data); //比较前面的部分这个题目 if(strcmp(pre_userdata,pre_st_data)!=0) { res=0; } char ch2 = fgetc(fp2);//获取空行 char ch3 = fgetc(fp3);//获取空行 if(ch2!='/n')res=res&2;//格式判断pre //如果标准的答案与用户数据输出的答案一致就不用去验证是否正确了 如果不相等 那么需要验证 if(strcmp(userdata,standard_data)!=0)//判断impossible { data_check(userdata); } //如果有组数据WA了 就直接跳出 不判断余下的数据了res<2表示wa res==2表示格式错误 if(res<=2)break; } if(res<=2) { return 0;//表示WA } else { return 1;//表示AC } fclose(fp1);//关闭文件 fclose(fp2); fclose(fp3); return 0; }