回复 10 楼 TonyDeng
这还得接着写代码实现吗? 数据准备好 代码按语言规范来 就可以照搬实现了 有点不想写代码了 越来越喜欢数学和哲学了 伪代码挺好
[ 本帖最后由 zhu224039 于 2014-6-27 16:15 编辑 ]
我要成为嘿嘿的黑客,替天行道
#include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <string.h> int str_to_num(char *str,int n); void strs_to_nums(char *str,int *data,int n); void nums_to_strs(int *num,char *string); void function(int countA,int countB,int flag,int n,int i); int arrary[5][4]; int *data; int arrary1[5][2]; int _tmain(int argc, _TCHAR* argv[]) { FILE *fpin,*fpout; char str[10], *datastring; int num1=0,num2,flag,counta,countb,i; fpin=fopen("c:\\ponit.in","r"); if(fpin==NULL){ printf("打开数据文件失败!"); exit(0); } fpout=fopen("c:\\ponit.out","w+"); if(fpout==NULL){ fclose(fpin); printf("打开记录结果文件失败!"); exit(0); } fgets(str,5,fpin); num1=str_to_num(str,5); //printf("%d\n",num1); while(num1-->0){ memset(arrary,0,80); memset(arrary1,0,40); fgets(str,10,fpin); num2=str_to_num(str,10); datastring=(char*)malloc(sizeof(char)*2*num2+2); data=(int*)malloc(sizeof(int)*num2); fgets(datastring,2*num2+2,fpin); strs_to_nums(datastring,data,num2); free(datastring); flag=0;counta=0;countb=0;i=0; function(counta,countb,flag,num2-1,i); if(!((arrary[2][3]==1&&arrary[4][3]==0)||(arrary[2][3]==0&&arrary[4][3]==1))) //猜解成功的条件是 要么在第三场取得胜利,要么就是在第五场取得 fputs("unknow\n",fpout); //其余的都是错误的猜解 //printf("unkonw"); else{ datastring=(char*)malloc(sizeof(char)*20); for(i=0;arrary1[i][0]!=0&&i<5;i++){ //printf("%d %d\n",arrary1[i][0],arrary1[i][1]); nums_to_strs(arrary1[i],datastring); fputs(datastring,fpout); } free(datastring); } free(data); } //getchar(); fclose(fpin); fclose(fpout); return 0; } int str_to_num(char *str,int n) { int i=0,num=0; for(;i<n;i++){ if(str[i]=='\n'||str[i]=='\0') break; num=num*10+str[i]-'0'; //printf("%x\n",str[i]); } return num; } void strs_to_nums(char *str,int *data,int n) { int i=0; for(;i<n;i++){ if(str[2*i]=='X') data[i]=10; else data[i]=str[2*i]-'0'; //printf("%c ",str[2*i]); } } void nums_to_strs(int *num,char *string) { int i,j=0,k=0; char p[8]; while(k<2){ itoa(num[k],p,10); for(i=0;i<8;i++){ if(p[i]=='\0') break; string[j]=p[i]; j++; } if(k==0){ string[j]=':'; j++; } k++; } string[j]='\n'; string[j+1]='\0'; } void function(int countA,int countB,int flag,int n,int i) //核心部件 { int j,count=0; for(j=n;j>=0;j--){ if(arrary[2][3]>1) return; if(arrary[4][3]>1) return; if(arrary[2][3]==1&&arrary[4][3]==1) return; //有多个解的时候 提前退出猜解 if(flag==0) { //你计分一次 我计分一次 countA+=data[j]; flag=1; } else{ countB+=data[j]; flag=0; } if ((countA==21&&countB<=19) || (countA>21 && (countA-countB==2))){ //一局比赛满足胜利的情况 arrary[i][0]=countA; arrary[i][1]=countB; if(j==0){ //猜解成功一次,并且分别是在第三场或者第五场胜利的时候,arrary[i][3]对 if(i==2||i==4){ //这种情况计数 arrary[i][3]+=1; if((arrary[2][3]==1&&arrary[4][3]==0)||(arrary[2][3]==0&&arrary[4][3]==1)) //猜解结果从描述轨迹数组中 for(j=i;j>=0;j--){ //转储到结果数组中 arrary1[i-j][0]=arrary[j][0]; arrary1[i-j][1]=arrary[j][1]; } } return; } function(0,0,0,j-1,i+1); //在一局猜解成功的基础上,进行下一局的猜解 } if ((countA>=21&&(countA-countB<-1)&&flag==1&&data[j-1]!=10) || (countA>21&&(countA-countB>2)&&flag==0&&data[j-1]!=10)){ //猜解失败返回 return; } if(j==0) return; //猜解失败返回 if(j>0&&data[j-1]==10){ //面对 X 字符的处理 function(countA,countB,flag,j-1,i); //X=10的处理过程 if(flag==0) //制造连读的功能 flag=1; else flag=0; function(countA,countB,flag,j-1,i); //X〉10的处理过程 } } }