首先我们复习一下将二维数组作为形参传递的方式:
1. func(type array[ ][3],int size)
2.func(type array[10][2],int size)
3.func(type *array[ ],int size)
4.func(type **array,int size)
前两种二维数组可以用array[i][j]的方式访问使用,后两种只能用*((int *)array+size*i+j)的方式访问使用
下面说明一下关于函数返回二维数组的问题,只要在函数参数列表当中填入在main函数定义的数组,即可对该数组进行操作,无需return,或也可使用结构体
应用如下:
- 类似于五子棋,X,O为黑白,有一行一列或对角线连成则为赢
不过并不是五子棋一边下一边判断,而是全部数组输入完毕后判断,比较基础,若要改进为五子棋,放入循环即可。
#include <iostream>
#include <stdio.h>
# define SIZE 5
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int Game(int game[][SIZE])
{
int i,j,flag=1; //flag=1正对角线,-1反对角线
int numOfO_R=0,numOfO_C=0; //每行每列的O
int numOfX_R=0,numOfX_C=0; //每行每列的X
int numOfO_Pos=0,numOfX_Pos=0; //正对角线
int numOfO_Neg=0,numOfX_Neg=0; //反对角线
//检查行列
for(i=0;i<SIZE;i++)
{
for(j=0;j<SIZE;j++)
{
if(game[i][j]==1) numOfO_R++; //第i行
else numOfX_R++;
if(game[j][i]==1) numOfO_C++; //第i列
else numOfX_C++;
}
if(numOfO_R==SIZE||numOfO_C==SIZE) return 1;
else if(numOfX_R==SIZE||numOfX_C==SIZE) return 0;
}
//检查对角线
for(i=0;i<SIZE;i++)
{
for(j=0;j<SIZE;j++)
{
if(flag==1) //正对角线
{
if(game[i][i]==1) numOfO_Pos++;
else numOfX_Pos++;
flag=-1;
j--; //为保证反对角线同时判断
}
if(flag==-1)
{
if(game[i][SIZE-i-1]==1) numOfO_Neg++;
else numOfX_Neg++;
flag=1;
}
}
if(numOfO_Pos==SIZE||numOfO_Neg==SIZE) return 1;
else if(numOfX_Pos==SIZE||numOfX_Neg==SIZE) return 0;
}
return -1;
}
int main(int argc, char** argv) {
int result=-1;
int game[SIZE][SIZE];
for(int i=0;i<SIZE;i++)
for(int j=0;j<SIZE;j++)
scanf("%d",&game[i][j]);
result=Game(game);
if(result==1) printf("O win!\n");
if(result==0) printf("X win!\n");
else printf("tie!\n");
return 0;
}
- 多项式加法
题目内容:
一个多项式可以表达为x的各次幂与系数乘积的和,比如:
2x6+3x5+12x3+6x+20
现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出。
程序要处理的幂最大为100。
输入格式:
总共要输入两个多项式,每个多项式的输入格式如下:
每行输入两个数字,第一个表示幂次,第二个表示该幂次的系数,所有的系数都是整数。第一行一定是最高幂,最后一行一定是0次幂。
注意第一行和最后一行之间不一定按照幂次降低顺序排列;如果某个幂次的系数为0,就不出现在输入数据中了;0次幂的系数为0时还是会出现在输入数据中。
输出格式:
从最高幂开始依次降到0幂,如:
2x6+3x5+12x3-6x+20
注意其中的x是小写字母x,而且所有的符号之间都没有空格,如果某个幂的系数为0则不需要有那项。
输入样例:
6 2
5 3
3 12
1 6
0 20
6 2
5 3
2 12
1 6
0 20
输出样例:
4x6+6x5+12x3+12x2+12x+40
#include <iostream>
#include <stdio.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//初始化多项式,只适用于一定有常数项的情况,可自行修改
int initPoly(int poly[][2])
{
int i=1;
int cnt=1;
scanf("%d %d",&poly[0][0],&poly[0][1]);
while(poly[i-1][0]!=0)
{
scanf("%d %d",&poly[i][0],&poly[i][1]);
i++;
cnt++;
}
return cnt; //数组大小
}
void Poly(int poly1[][2], int poly2[][2],int size1,int size2)
{
int i=size1-1;
int j=size2-1;
int k=size1+size2-1;
int poly[k+1][2]; //最后输出的多项式数组
//从大到小排列,此处考虑到两个多形式可能项数不一致,幂不一致的情况
while(i>=0&&j>=0)
{
if(poly1[i][0]<poly2[j][0]) {
poly[k][0]=poly1[i][0];
poly[k--][1]=poly1[i--][1];
}
else if(poly1[i][0]>poly2[j][0]) {
poly[k][0]=poly2[j][0];
poly[k--][1]=poly2[j--][1];
}
else {
poly[k][0]=poly1[i][0];
poly[k--][1]=poly1[i--][1]+poly2[j--][1];
}
}
while(i>=0)
{
poly[k][0]=poly1[i][0];
poly[k--][1]=poly1[i--][1];
}
while(j>=0)
{
poly[k][0]=poly1[j][0];
poly[k--][1]=poly1[j--][1];
}
k++;
printf("%dx%d",poly[k][1],poly[k][0]);
while(k<size1+size2-1)
{
k++;
if(poly[k][1]<0) printf("%dx%d",poly[k][1],poly[k][0]); //系数为负的情况
else if(poly[k][1]==0&&poly[k][0]!=0) ; //系数等于零而幂不等于零的情况
else printf("+%dx%d",poly[k][1],poly[k][0]);
}
}
int main(int argc, char** argv) {
int poly1[10][2];
int poly2[10][2];
int cnt1;
int cnt2;
cnt1=initPoly(poly1);
cnt2=initPoly(poly2);
Poly(poly1,poly2,cnt1,cnt2);
return 0;
}
- 鞍点
题目内容:
给定一个n*n矩阵A。矩阵A的鞍点是一个位置(i,j),在该位置上的元素是第i行上的最大数,第j列上的最小数。一个矩阵A也可能没有鞍点。
你的任务是找出A的鞍点。
输入格式:
输入的第1行是一个正整数n, (1<=n<=100),然后有n行,每一行有n个整数,同一行上两个整数之间有一个或多个空格。
输出格式:
对输入的矩阵,如果找到鞍点,就输出其下标。下标为两个数字,第一个数字是行号,第二个数字是列号,均从0开始计数。
如果找不到,就输出
NO
题目所给的数据保证了不会出现多个鞍点。(仍可考虑有多个鞍点的情况)
输入样例:
4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9
输出样例:
2 1
#include <iostream>
#include <stdio.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int initMatrix(int matrix[][10])
{
int size;
scanf("%d",&size);
for(int i=0;i<size;i++)
for(int j=0;j<size;j++)
scanf("%d",&matrix[i][j]);
return size;
}
void findPoint(int matrix[][10],int size)
{
int i,j,k;
int n; //n记录鞍点的列数
int flag=0; //最终flag=0则无鞍点
for(i=0;i<size;i++)
{
int tmp=matrix[i][0];
for(j=0;j<size;j++)
{
if(matrix[i][j]>tmp)
{
tmp=matrix[i][j];
n=j; //每行最大为拟鞍点
}
}
//第n列
for(k=0;k<size;k++)
if(tmp>matrix[k][n]) break; //若拟鞍点不是该列最小则不是鞍点
if(k==size)
{
flag=1;
printf("%d %d\n",i,n); //有鞍点,打印
}
}
if(flag==0) printf("NO\n"); //整个矩阵无鞍点
}
int main(int argc, char** argv) {
int matrix[10][10];
int size;
size=initMatrix(matrix);
findPoint(matrix,size);
return 0;
}