坏巧克力问题!!急求!!! 两个玩家轮流掰一块m*n的巧克力,其中一块1*1的小块是坏的,每次掰只能顺着方格的边界,沿直线一掰到底。每拜一次,掰的人把两块中不含坏巧克力的吃掉,谁碰到最后那块坏巧克力就输了,写一个互动程序,让大家可以和计算机玩,程序在胜局应该走出必胜的一步,在败局只要下出合规的一步就好 小弟要交作业,急求!!!完整程序更好,只有必胜的算法也可!!各位大人解决一下!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 //巧克力大小#define M 8#define N 8//设置坏巧克力块的位置#define X 4#define Y 4void print(char cho[M][N]){ //打印出巧克力形状 for(int i=0;i<M;i++) { for(int j=0;j<N;j++) printf("%d ",cho[i][j]); printf("\n"); }}//执行掰巧克力的函数void Execute(char cho[M][N],char pos,int index){ //掰下一列 if(pos=='C' || pos=='c') { for(int i=0;i<M;i++) { for(int j=0;j<N;j++) if(j==index)cho[i][j]=3; } } //掰下一行 else if(pos=='R' || pos=='r') { for(int i=0;i<M;i++) { if(i==index) { for(int j=0;j<N;j++)cho[i][j]=3; } } }}//分析行,给出决策可以掰那些行void Row(char cho[M][N],char dm[]){ for(int i=0;i<M;i++) { int s=-1; //去掉坏巧克力所在行 if(i!=X) { for(int j=0;j<N;j++) { if(cho[i][j]!=3)s=1; } } dm[i]=s; }}//分析列,给出决策可以掰那些列void Col(char cho[M][N],char dm[]){ for(int j=0;j<N;j++) { int s=-1; //去掉坏巧克力所在列 if(j!=Y) { for(int i=0;i<M;i++) { if(cho[i][j]!=3)s=1; } } dm[j]=s; }}//预处理,计算机模拟执行掰的过程,然后计算剩余步骤int PreDispose(char cho[M][N],char dm[]){ int cnt=0; //巧克力块的副本 char cho_t[M][N]; //可以掰的行标,用1表示 char row[M]; //可以掰的列表,用1表示 char col[N]; memset(row,-1,M);memset(col,-1,N); memcpy(cho_t,cho,M*N); Execute(cho_t,dm[0],dm[1]); //分析行,给出决策 Row(cho,row); //分析列,给出决策 Col(cho,col); for(int i=0;i<M;i++) if(row[i]!=-1)cnt++; for(int j=0;j<N;j++) if(col[j]!=-1)cnt++; return cnt;}//分析现在的巧克力,并给出决策,掰哪一块void Alaysize(char cho[M][N],char dm[2]){ //可以掰的行标,用1表示 char row[M]; //可以掰的列表,用1表示 char col[N]; memset(row,-1,M);memset(col,-1,N); //分析行,给出决策 Row(cho,row); //分析列,给出决策 Col(cho,col); //进行预处理,判断执行后的剩余次数,找到一个剩余次数为奇数的步骤执行 for(int i=M-1;i>=0;i--) { if(row[i] != -1) { dm[0]='R'; dm[1]=i; if(PreDispose(cho,dm)%2!=0) { printf("找到最佳步骤:\n"); return; } } } for(int j=N-1;j>=0;j--) { if(col[j]!=-1) { dm[0]='C'; dm[1]=j; if(PreDispose(cho,dm)%2!=0) { printf("找到最佳步骤:\n"); return; } } } //如果没有最佳步骤,则随便走一步 return;}//计算机掰巧克力的过程void Computer(char cho[M][N]){ char dm[2]; dm[0]=-1;dm[1]=-1; //让计算机开始分析巧克力,并给出决策 Alaysize(cho,dm); printf("计算机给出决策 %c %d\n",dm[0],dm[1]); if(dm[0]==-1 && dm[1] == -1) { printf("计算机输了\n"); } //掰巧克力 Execute(cho,dm[0],dm[1]);}int Game(){ //制作巧克力 char cho[M][N]; char pos[10]; char cmd=0; int index=0; //设置坏巧克力 memset(cho,0,M*N); cho[X][Y]=1; //打印巧克力 print(cho); printf("请输入命令:\n"); scanf("%s",pos); while(1) { cmd=pos[0]; index=atoi(pos+1); if(cmd=='Q' || cmd== 'q')break; //掰巧克力 Execute(cho,cmd,index); //打印出巧克力形状 print(cho); //计算机处理 Computer(cho); //打印出巧克力形状 print(cho); printf("请输入命令:\n"); scanf("%s",pos); } return 0;}从Game函数开始 楼上上的代码能再完整点吗?error C2065: 'memset' : undeclared identifiererror C2065: 'atoi' : undeclared identifier 我新建一个mfc对话框的程序,怎样把对话框资源去掉, 1024*768*2的疑惑 谁有bmp序列转换为AVI文件的代码呀?先谢谢了!! MessageBox编程的困惑 关于OnOpenDocument函数 怎样在当前程序往一个打开的notepad写入字符串? 关于CListView的问题: 背景图片怎么不见了?(vc.net) 从伊拉克战争 想到轰炸大使馆那天。 用VC第一次遇到这样的奇怪问题高手快帮忙 物理磁盘如何分配逻辑盘符 AfxRegisterWndClass(0,....)第一个参数的问题
//巧克力大小
#define M 8
#define N 8//设置坏巧克力块的位置
#define X 4
#define Y 4void print(char cho[M][N])
{
//打印出巧克力形状
for(int i=0;i<M;i++)
{
for(int j=0;j<N;j++)
printf("%d ",cho[i][j]);
printf("\n");
}
}
//执行掰巧克力的函数
void Execute(char cho[M][N],char pos,int index)
{
//掰下一列
if(pos=='C' || pos=='c')
{
for(int i=0;i<M;i++)
{
for(int j=0;j<N;j++)
if(j==index)cho[i][j]=3;
}
}
//掰下一行
else if(pos=='R' || pos=='r')
{
for(int i=0;i<M;i++)
{
if(i==index)
{
for(int j=0;j<N;j++)cho[i][j]=3;
}
}
}
}
//分析行,给出决策可以掰那些行
void Row(char cho[M][N],char dm[])
{
for(int i=0;i<M;i++)
{
int s=-1;
//去掉坏巧克力所在行
if(i!=X)
{
for(int j=0;j<N;j++)
{
if(cho[i][j]!=3)s=1;
}
}
dm[i]=s;
}
}
//分析列,给出决策可以掰那些列
void Col(char cho[M][N],char dm[])
{
for(int j=0;j<N;j++)
{
int s=-1;
//去掉坏巧克力所在列
if(j!=Y)
{
for(int i=0;i<M;i++)
{
if(cho[i][j]!=3)s=1;
}
}
dm[j]=s;
}
}//预处理,计算机模拟执行掰的过程,然后计算剩余步骤
int PreDispose(char cho[M][N],char dm[])
{
int cnt=0;
//巧克力块的副本
char cho_t[M][N]; //可以掰的行标,用1表示
char row[M];
//可以掰的列表,用1表示
char col[N];
memset(row,-1,M);memset(col,-1,N); memcpy(cho_t,cho,M*N);
Execute(cho_t,dm[0],dm[1]);
//分析行,给出决策
Row(cho,row);
//分析列,给出决策
Col(cho,col); for(int i=0;i<M;i++)
if(row[i]!=-1)cnt++;
for(int j=0;j<N;j++)
if(col[j]!=-1)cnt++; return cnt;
}//分析现在的巧克力,并给出决策,掰哪一块
void Alaysize(char cho[M][N],char dm[2])
{
//可以掰的行标,用1表示
char row[M];
//可以掰的列表,用1表示
char col[N]; memset(row,-1,M);memset(col,-1,N); //分析行,给出决策
Row(cho,row);
//分析列,给出决策
Col(cho,col);
//进行预处理,判断执行后的剩余次数,找到一个剩余次数为奇数的步骤执行
for(int i=M-1;i>=0;i--)
{
if(row[i] != -1)
{
dm[0]='R';
dm[1]=i;
if(PreDispose(cho,dm)%2!=0)
{
printf("找到最佳步骤:\n");
return;
}
}
}
for(int j=N-1;j>=0;j--)
{
if(col[j]!=-1)
{
dm[0]='C';
dm[1]=j;
if(PreDispose(cho,dm)%2!=0)
{
printf("找到最佳步骤:\n");
return;
}
}
}
//如果没有最佳步骤,则随便走一步
return;
}//计算机掰巧克力的过程
void Computer(char cho[M][N])
{
char dm[2];
dm[0]=-1;dm[1]=-1;
//让计算机开始分析巧克力,并给出决策
Alaysize(cho,dm);
printf("计算机给出决策 %c %d\n",dm[0],dm[1]);
if(dm[0]==-1 && dm[1] == -1)
{
printf("计算机输了\n");
}
//掰巧克力
Execute(cho,dm[0],dm[1]);
}int Game()
{
//制作巧克力
char cho[M][N]; char pos[10]; char cmd=0;
int index=0; //设置坏巧克力
memset(cho,0,M*N);
cho[X][Y]=1;
//打印巧克力
print(cho); printf("请输入命令:\n");
scanf("%s",pos); while(1)
{
cmd=pos[0];
index=atoi(pos+1);
if(cmd=='Q' || cmd== 'q')break; //掰巧克力
Execute(cho,cmd,index);
//打印出巧克力形状
print(cho); //计算机处理
Computer(cho);
//打印出巧克力形状
print(cho); printf("请输入命令:\n");
scanf("%s",pos);
} return 0;
}从Game函数开始
error C2065: 'memset' : undeclared identifier
error C2065: 'atoi' : undeclared identifier