回复 17 楼 beyondyf
程序代码:
#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的处理过程
}
}
}
代码写出来了咯
[
本帖最后由 zhu224039 于 2014-6-29 04:20 编辑 ]