二维数组的相关题目

1.单元格

Cat Taro有一个N行和N列的正方形网格。网格的每个单元格都涂成黑色或白色。

Taro想要选择一段连续的单元格,这段单元格必须位于同一列中并且有相同的颜色。

求他可以选择的最大数量的单元格。

输入格式

第一行,一个整数N。1 <= N <= 50。

接下来是N行N列的网格。每个各自要么是白色 'W', 要么是黑色 'B’。

输出格式

一个整数,表示最多数量的单元格。

输入/输出例子1

输入:

4

BWBW

BBWB

WWWB

BWWW

输出:

3

代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,maxx;
char a[105][105];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
            cin>>a[i][j];
    }
    for(int j=1;j<=n;j++)
    {
        int cot=0;
        for(int i=1;i<=n;i++)
        {
            if(a[i][j]=='B')cot++;
            else maxx=max(maxx,cot),cot=0;
        }
        maxx=max(maxx,cot);
    }
    for(int j=1;j<=n;j++)
    {
        int cot=0;
        for(int i=1;i<=n;i++)
        {
            if(a[i][j]=='W')cot++;
            else maxx=max(maxx,cot),cot=0;
        }
        maxx=max(maxx,cot);
    }
    cout<<maxx;
    return 0;
}

2.01矩阵反转

陈老师最近在研究一个手机游戏,要求是:有一个0、1组成的矩形,每次可以选一点,比如R行C列的,用(R,C)表示,这时包括(R,C)在内的所有左上角区域中的数字将反转,即0变成1,1变成0。

陈老师想让你编程计算出最少要选几次,就可以把矩形中所有数字变为0。

注:给出的矩阵保证有解。

输入格式

文件第一行有两个整数N、M  (1≦N,M≦50),表示矩阵的行和列大小。下面有N行,每行是一个长度为M的01串。

输出格式

仅一个数,要把矩形中所有数字变为0最少的选择次数。

输入/输出例子1

输入:

2 4

0000

0000

输出:

0

输入/输出例子2

输入:

2 2

01

01

输出:

2

代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,m,ans;
char a[60][60];
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>a[i][j];
	for(int i=n;i>=1;i--)
	{
		for(int j=m;j>=1;j--)
		{
			if(a[i][j]=='1')
			{
				ans++;     
				for(int ii=1;ii<=i;ii++)
					for(int jj=1;jj<=j;jj++)
						if(a[ii][jj]=='1')a[ii][jj]='0';
						else a[ii][jj]='1';
			}
		}
	}
		          
	cout<<ans;
	return 0;
}

3.矩阵的转置

矩阵的转置:输入n*m的矩阵,将其转置后输出,矩阵转置是矩阵的行列交换,如:

      A:                              B:

      1   2   3     转置为     1   4   7  10

      4   5   6                     2   5   8  11

      7   8   9                     3   6   9  12

     10  11  12

输入格式

第一行两个整数n、m(n,m<=100),表示矩阵的行数和列数;

接下来共n行,每行m个整数。

输出格式

m行,每行n个数,表示转置后的矩阵。

输入/输出例子1

输入:

4 3

1 2 3

4 5 6

7 8 9

10 11 12

输出:

1 4 7 10

2 5 8 11

3 6 9 12

代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,m,a[105][105];
int main(){
    cin>>n>>m;
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            cin>>a[i][j];
    for(int j=0;j<m;j++)
    {
        for(int i=0;i<n;i++)
            cout<<a[i][j]<<" ";
        cout<<endl;
    }
    
    return 0;
}

4.填单词

现在有一个N*N(5<=N<=100)的方格,其中格子中为‘-’的表示空格,为‘#’表示不可填格子。比如

----#

--##-

-----

-##--

#----

一个单词长度至少是2,并按通常的纵横字谜规则填。上图中,我们可以填写5个横向的单词,可以填写4个纵向的单词。

你的任务是对于给定的方格,求可以有多少个横向和纵向的单词。

输入格式

第一行: 一个整数 N。

第二至第N+1行: 第行有 N 个字母,或者是'#' 或者是 '-'. 表示方格的初始状态.

输出格式

只一行: 有两个用空格分开的整数,分别为横向的单词数和纵向的单词数.

输入/输出例子1

输入:

5

----#

--##-

-----

-##--

#----

输出:

5 4

代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,m,ans1,ans2,cot=1;
char a[105][105];
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>a[i][j];
    for(int i=1;i<=n;i++)
    {
        cot=0;
        for(int j=1;j<=n;j++)
        {
            if(a[i][j]=='-')cot++;
            else 
            {
                if(cot>=2)ans1++;
                cot=0;
            }
        }
        if(cot>=2)ans1++;
    }
    for(int j=1;j<=n;j++)
    {
        cot=0;
        for(int i=1;i<=n;i++)
        {
            if(a[i][j]=='-')cot++;
            else 
            {
                if(cot>=2)ans2++;
                cot=0;
            }
        }
        if(cot>=2)ans2++;
    }
    cout<<ans1<<" "<<ans2;
    return 0;
}

5.监考老师

在一个大试场里,有n行m列的考生,小王和众多同学正在考试,这时,有一部分考生作弊,当然,监考老师能发现他们。但是只有一个监考老师,他由于高度近视,只能发现与他同行同列的作弊者,而且由于监考老师年老体弱,在考试过程中无法移动。现在已知n*m个考生中谁在作弊,请帮监考老师找一个位置,可以发现最多的作弊者(监考老师可以和某个考生在同一位置)。如果监考老师的位置上的考生在作弊,那么监考老师先前后看,发现他作弊,再左右看,又发现他作弊,算做发现2个考生作弊。

输入格式

第一行两个数n,m ,表示试场是n*m的,接下来是n*m的矩阵,1表示作弊,0表示不作弊。

输出格式 

共一行,一个数,表示最多可以发现多少作弊者。

输入/输出例子1

输入:

5 5 

0 0 1 0 0 

0 0 1 0 0 

1 1 1 1 1 

0 0 1 0 0 

0 0 1 0 0 

输出:

10

样例解释

监考老师在最中间,那个位置上的作弊者算作2次

【数据范围】 

对于50 %的数据,n,m大于0小于等于10,对于100 %的数据,n,m大于0小于等于2000。

代码如下:

#include<bits/stdc++.h>
using namespace std;
int n,m,a[2005][2005],ans,hang[2005],lie[2005];
int main(){
    cin>>n>>m;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++){
            cin>>a[i][j];
        }
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++){
            if(a[i][j]==1)hang[i]++;
        }
    }
    for(int j=0;j<m;j++)
    {
        for(int i=0;i<n;i++){
            if(a[i][j]==1)lie[j]++;
        }
    }
    sort(hang,hang+n);
    sort(lie,lie+m);
    cout<<hang[n-1]+lie[m-1];
    return 0;
}

XXS代码,大神不喜勿喷。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的二维数组N子棋的C++代码示例: ```c++ #include <iostream> #include <vector> using namespace std; const int n = 3; // N子棋的棋盘大小为n*n char board[n][n]; // 棋盘 // 初始化棋盘 void initBoard() { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { board[i][j] = '-'; } } } // 打印棋盘 void printBoard() { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cout << board[i][j] << " "; } cout << endl; } } // 判断是否有玩家获胜 bool isWin(char player) { // 检查行 for (int i = 0; i < n; i++) { int count = 0; for (int j = 0; j < n; j++) { if (board[i][j] == player) { count++; } } if (count == n) { return true; } } // 检查列 for (int j = 0; j < n; j++) { int count = 0; for (int i = 0; i < n; i++) { if (board[i][j] == player) { count++; } } if (count == n) { return true; } } // 检查对角线 int count1 = 0; int count2 = 0; for (int i = 0; i < n; i++) { if (board[i][i] == player) { count1++; } if (board[i][n-i-1] == player) { count2++; } } if (count1 == n || count2 == n) { return true; } return false; } int main() { initBoard(); // 初始化棋盘 char player1 = 'X'; // 玩家1执X子 char player2 = 'O'; // 玩家2执O子 char currentPlayer = player1; // 当前玩家为玩家1 bool gameOver = false; // 游戏是否结束 while (!gameOver) { printBoard(); // 打印棋盘 int row, col; cout << "请玩家" << currentPlayer << "输入落子位置(行 列): "; cin >> row >> col; // 判断位置是否合法 if (row < 1 || row > n || col < 1 || col > n) { cout << "位置不合法,请重新输入!" << endl; continue; } if (board[row-1][col-1] != '-') { cout << "该位置已经有棋子,请重新输入!" << endl; continue; } // 在棋盘上落子 board[row-1][col-1] = currentPlayer; // 判断是否有玩家获胜 if (isWin(currentPlayer)) { gameOver = true; cout << "恭喜玩家" << currentPlayer << "获胜!" << endl; } else { // 判断是否平局 bool isTie = true; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (board[i][j] == '-') { isTie = false; break; } } if (!isTie) { break; } } if (isTie) { gameOver = true; cout << "平局!" << endl; } else { // 切换到下一个玩家 if (currentPlayer == player1) { currentPlayer = player2; } else { currentPlayer = player1; } } } } printBoard(); // 打印最终棋盘 return 0; } ``` 该代码中,initBoard()函数用于初始化棋盘,printBoard()函数用于打印棋盘,isWin()函数用于判断是否有玩家获胜,main()函数则是游戏的主要逻辑。在游戏中,玩家1执X子,玩家2执O子,玩家轮流在棋盘上落子,直到有玩家获胜或者平局。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值