贪心算法2(c++)

最大子矩阵
描述
已知矩阵的大小定义为矩阵中所有元素的和。给定一个矩阵,你的任务是找到最大的非空(大小至少是1*1)子矩阵。
比如,如下4*4的矩阵

0- 2 -7 0

9 2 -6 2
-4 1 -4 1

-1 8 0-2

的最大子矩阵是
9 2
-4 1
-18
这个子矩阵的大小是15。

输入输入是一个N*N的矩阵。输入的第一行给出N(0<N<=100)。再后面的若干行中,依次(首先从左到右给出第一行的N个整数,再从左到右给出第二行的N个整数…)给出矩阵中的N2个整数,整数之间由空白字符分隔(空格或者空行)。已知矩阵中整数的范围都在[-127,127]。
输出
输出最大子矩阵的大小。
样例输入
4

0 -2 -7 0

9 2 -6 2

-4 1 -4 1

-1 8 0 -2
样例输出
15

#include <iostream>
using namespace std;
int main()
{
	int n;
	cin>>n;
	int a[110][110] = {0};
	int b[110][110] = {0};
	for(int i = 1;i<=n;i++)
	{
		for(int j = 1;j<=n;j++)
		{
			cin>>a[i][j];
			if(i==1)
			{
				b[i][j] = b[i][j-1]+a[i][j];
			}
			else
			{
				b[i][j] = b[i-1][j]+a[i][j]+b[i][j-1]-b[i-1][j-1];
			}
		}
	}
	
	int cnt = 0;
	int ma = -99999;
	for(int i1 = 1;i1<=n-1;i1++)
	{
		for(int j1 = 1;j1<=n-1;j1++)
		{
			for(int i2 = i1+1;i2<=n;i2++)
			{
				for(int j2 = j1+1;j2<=n;j2++)
				{
					if(i1==1&&j1==1)
					{
						cnt = b[i2][j2];
					}
					else if(i1!=1&&j1==1)
					{
						cnt = b[i2][j2]-b[i1-1][j2];
					}
					else if(i1==1&&j1!=1)
					{
						cnt = b[i2][j2]-b[i2][j1-1];
					}
					else if(i1!=1&&j1!=1)
					{
						cnt = b[i2][j2]-b[i2][j1-1]-b[i2][j1-1]+b[i1-1][j1-1];
					}
					ma = max(cnt,ma);
				}
			}
		}
	}
	cout<<ma;
	return 0;
}

均分纸牌
题目描述
有n堆纸牌(2<n≤200),排成一行,编号分别为1,2....n。已知每堆纸牌有一定的张数,且张数之和均为n的倍数。移动各堆中的任意张纸牌,使每堆的数量达到相同,且移动次数最少。
移动规则:每次可以移动任意的张数,第1堆可以移向第2堆第2堆可以移向第1堆或第3堆,。第n堆只可以移向第n-1堆。

例如,当n=4时:

堆号1 2 3 4

张数3 5 4 8
移动的方法有许多种,其中的一种方案:

① 第2堆向第1堆移动2张,成为:5 3 4 8

②第4堆向第3堆移动3张,成为:5 3 7 5

③第3堆向第2堆移动2张,成为:5 5 5 5

经过三次移动,每堆都成为5张。
输入
第一行一个整数n。
第二行n个整数,用空格分隔。
输出
1个整数(表示最少移动次数)

样例

输入复制
4
3 5 4 8
输出复制
2

#include <iostream>
using namespace std;
int main()
{
	int n;
	cin>>n;
	int a[210] = {0};
	int sum = 0;
	for(int i = 0;i<n;i++)
	{
		cin>>a[i];
		sum = sum+a[i];
	}
	sum = sum/n;
	int cnt = 0;
	for(int i = 0;i<n;i++)
	{
		if(a[i]<sum)
		{
			a[i+1] = a[i+1]-(sum-a[i]);
			a[i] = sum;
			cnt++;
		}
		else if(a[i]>sum)
		{
			a[i+1] = a[i+1]+a[i]-sum;
			a[i] = sum;
			cnt++;
		}
	}
	cout<<cnt;
	return 0;
}

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
贪心算法是一种常见的算法思想,它在求解最优化问题时,每一步都选择当前看起来最优的解决方案,而不考虑全局最优解。对于五子棋这个游戏,贪心算法可以用来制定AI的策略。 在五子棋中,贪心算法可以通过评估当前局面的得分来选择下一步的落子位置。常见的评估方法是通过计算每个位置的连续棋子数来判断该位置的得分,然后选择得分最高的位置进行落子。 以下是一个简单的贪心算法五子棋的C++实现示例: ```cpp #include <iostream> #include <vector> using namespace std; const int SIZE = 15; // 棋盘大小 // 评估函数,计算某个位置的得分 int evaluate(vector<vector<int>>& board, int row, int col, int player) { int score = 0; int dx = {1, 0, 1, 1}; int dy[4] = {0, 1, 1, -1}; for (int i = 0; i < 4; i++) { int count = 0; int x = row, y = col; while (x >= 0 && x < SIZE && y >= 0 && y < SIZE && board[x][y] == player) { count++; x += dx[i]; y += dy[i]; } score += count; } return score; } // 贪心算法,选择得分最高的位置进行落子 void greedyAlgorithm(vector<vector<int>>& board, int player) { int maxScore = 0; int bestRow = -1, bestCol = -1; for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { if (board[i][j] == 0) { int score = evaluate(board, i, j, player); if (score > maxScore) { maxScore = score; bestRow = i; bestCol = j; } } } } board[bestRow][bestCol] = player; } int main() { vector<vector<int>> board(SIZE, vector<int>(SIZE, 0)); // 初始化棋盘 // 玩家1先手落子 int player1 = 1; int row1, col1; cout << "玩家1,请输入落子位置(行 列):"; cin >> row1 >> col1; board[row1][col1] = player1; // AI玩家2贪心算法落子 int player2 = 2; greedyAlgorithm(board, player2); // 输出当前棋盘状态 for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { cout << board[i][j] << " "; } cout << endl; } return 0; } ``` 这段代码实现了一个简单的贪心算法五子棋的对战,玩家1先手输入落子位置,然后AI玩家2使用贪心算法选择最优位置进行落子,最后输出当前棋盘状态。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值