mooc 二維陣列的引數傳遞,二維陣列的應用 五子棋,多項式加法 鞍點 c語言
首先我們複習一下將二維陣列作為形參傳遞的方式:
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;
}