五子棋。输入一个19*19的矩阵,只包含数字0、1、2,表示两人下五子棋的棋牌状态,1、2分别表示两人的棋子,0表示空格。要求判断当前状态下能否有人获胜(横向、竖向或斜线方向连成5个同色棋子)。题目说明输入样例保证每条线上至多只有连续5个同色棋子,并且保证至多只有1人获胜。假如有人获胜,输出获胜者(1或2)加一个冒号,接着输出获胜的五连珠的第一个棋子的坐标,从上到下从左到右序号最小的为第一个,序号从1开始编号。假如无人获胜,输出no。
本人的问题:子函数 无法返回坐标
#include<stdio.h>
void main()
{
int panduan(int p[19][19],int i,int j,int m);
int p[19][19]={0},i,j,num=0,flag=0;
while(1){
num++;
scanf(“%d%d”,&i,&j);
if(p[i][j]==0)
p[i][j]=1;
else{
printf(“重新输入\n”);
scanf(“%d%d”,&i,&j);
p[i][j]=1;}
flag=panduan(p,i,j,1);
if(flag==1){
printf(“1\n”);
num=0;
for(i=0;i<19;i++)
for(j=0;j<19;j++)
p[i][j]=0;
break;
}
else printf(“no\n”);
if(num==181){
printf(“no\n”);
break;}
scanf(“%d%d”,&i,&j);
if(p[i][j]==0)
p[i][j]=2;
else{
printf(“重新输入\n”);
scanf(“%d%d”,&i,&j);
p[i][j]=2;}
flag=panduan(p,i,j,2);
if(flag==1){
printf(“2\n”);
num=0;
for(i=0;i<19;i++)
for(j=0;j<19;j++)
p[i][j]=0;
break;
}
else printf(“no\n”);
}
}
int panduan(int p[19][19],int i,int j,int m)
{
int o,n,num=1;
for(o=i+1;o<=19&&(p[o][j]==m);o++)
num++;
if(num>=5)
return(1);
else
for(o=i-1;o>=0&&(p[o][j]==m);o–)
num++;
if(num>=5)
return(1);
for(num=1,n=j+1;n<=19&&(p[i][n]==m);n++)
num++;
if(num>=5)
return(1);
else
for(o=j-1;n>=0&&(p[i][n]==m);n–)
num++;
if(num>=5)
return(1);
for(num=1,o=i-1,n=j-1;o>=0&&n>=0&&(p[o][n]==m);o–,n–)
num++;
if(num>=5)
return(1);
else for(o=i+1,n=j+1;o<=19&&n<=19&&(p[o][n]==m);o++,n++)
num++;
if(num>=5)
return(1);
for(num=1,o=i-1,n=j+1;o>=0&&n<=19&&(p[o][n]==m);o–,n++)
num++;
if(num>=5)
return(1);
else for(o=i+1,n=j-1;o<=19&&n>=0&&(p[o][n]==m);o++,n–)
num++;
if(num>=5)
return(1);
return(0);
}
本人的问题:子函数 无法返回坐标
#include<stdio.h>
void main()
{
int panduan(int p[19][19],int i,int j,int m);
int p[19][19]={0},i,j,num=0,flag=0;
while(1){
num++;
scanf(“%d%d”,&i,&j);
if(p[i][j]==0)
p[i][j]=1;
else{
printf(“重新输入\n”);
scanf(“%d%d”,&i,&j);
p[i][j]=1;}
flag=panduan(p,i,j,1);
if(flag==1){
printf(“1\n”);
num=0;
for(i=0;i<19;i++)
for(j=0;j<19;j++)
p[i][j]=0;
break;
}
else printf(“no\n”);
if(num==181){
printf(“no\n”);
break;}
scanf(“%d%d”,&i,&j);
if(p[i][j]==0)
p[i][j]=2;
else{
printf(“重新输入\n”);
scanf(“%d%d”,&i,&j);
p[i][j]=2;}
flag=panduan(p,i,j,2);
if(flag==1){
printf(“2\n”);
num=0;
for(i=0;i<19;i++)
for(j=0;j<19;j++)
p[i][j]=0;
break;
}
else printf(“no\n”);
}
}
int panduan(int p[19][19],int i,int j,int m)
{
int o,n,num=1;
for(o=i+1;o<=19&&(p[o][j]==m);o++)
num++;
if(num>=5)
return(1);
else
for(o=i-1;o>=0&&(p[o][j]==m);o–)
num++;
if(num>=5)
return(1);
for(num=1,n=j+1;n<=19&&(p[i][n]==m);n++)
num++;
if(num>=5)
return(1);
else
for(o=j-1;n>=0&&(p[i][n]==m);n–)
num++;
if(num>=5)
return(1);
for(num=1,o=i-1,n=j-1;o>=0&&n>=0&&(p[o][n]==m);o–,n–)
num++;
if(num>=5)
return(1);
else for(o=i+1,n=j+1;o<=19&&n<=19&&(p[o][n]==m);o++,n++)
num++;
if(num>=5)
return(1);
for(num=1,o=i-1,n=j+1;o>=0&&n<=19&&(p[o][n]==m);o–,n++)
num++;
if(num>=5)
return(1);
else for(o=i+1,n=j-1;o<=19&&n>=0&&(p[o][n]==m);o++,n–)
num++;
if(num>=5)
return(1);
return(0);
}
解决方案
10
1.返回结构体
2.通过指针/引用传参的方式将结果带出子函数
2.通过指针/引用传参的方式将结果带出子函数
5
通过返回结构体类型的变量可以获取多个参数;把想要返回的数据放入结构体里;
另外,也可以通过传入传出参数实现,但是不建议将函数参数数目超过5个;
另外,也可以通过传入传出参数实现,但是不建议将函数参数数目超过5个;
5
利用地址传递的特性,将返回的多个值存放于数组或结构体,最后返回只想这种数据类型的指针就可以了
10
用指针吧。或定义结构体