程序代码:
#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){
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))) //猜解为5局3胜制 当多次猜解为3局胜利或者多次我5局胜利
fputs("unknow\n",fpout); //或者1次3局胜利,一次5局胜利的情况或者根本就没猜解出来 为 unknow
//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);
//free(data); // 加上这两句程序会崩溃
//free(datastring);
}
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))){
// if(flag==1){
arrary[i][0]=countA;
arrary[i][1]=countB;
//}
//else{
// arrary[i][0]=countB;
// arrary[i][1]=countA;
//}
if(j==0){
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];
}
}
// else
// printf("unkonowA\n");
return;
}
function(0,0,0,j-1,i+1);
// printf("%d ",j-1);
//memset(arrary[i],0,4);
// return;
}
if ((countA>=21&&(countA-countB<-1)&&flag==1&&data[j-1]!=10) || (countA>21&&(countA-countB>2)&&flag==0&&data[j-1]!=10)){
//memset(arrary[i],0,4);
return;
}
if(j==0){//memset(arrary,0,20);
return;}
if(j>0&&data[j-1]==10){
function(countA,countB,flag,j-1,i);
if(flag==0)
flag=1;
else
flag=0;
function(countA,countB,flag,j-1,i);
}
}
}