洛谷 P2004 领地选择 Java实现 二维前缀和

题目描述

作为在虚拟世界里统帅千军万马的领袖,小 Z 认为天时、地利、人和三者是缺一不可的,所以,谨慎地选择首都的位置对于小 Z 来说是非常重要的。

首都被认为是一个占地 C×C 的正方形。小 Z 希望你寻找到一个合适的位置,使得首都所占领的位置的土地价值和最高。

输入格式
第一行三个整数 N,M,C,表示地图的宽和长以及首都的边长。

接下来 N 行每行 M 个整数,表示了地图上每个地块的价值。价值可能为负数。

输出格式
一行两个整数 X,Y,表示首都左上角的坐标。

题目详细:洛谷 P2004 领地选择

思路:二维(矩阵)前缀和

很普通的矩阵前缀和,但是要注意的是,要求的矩阵的边长是有条件的,所以只需要2个for循环即可。

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
public class Main {
	public static void main(String[] args) throws IOException{
		StreamTokenizer in=new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
		PrintWriter pw=new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
		in.nextToken();
		int N=(int)in.nval;
		in.nextToken();
		int M=(int)in.nval;
		in.nextToken();
		int C=(int)in.nval;
		int[][] sum=new int[N+1][M+1];
		
		for(int i=1;i<=N;i++)
			for(int j=1;j<=M;j++)
			{
				in.nextToken();
				sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+(int)in.nval;
			}
		int temp,max=0x80000000,f=0,g=0,r,b;
		for(int i=1;i<=N-C+1;i++)
			for(int j=1;j<=M-C+1;j++)
			{
				r=i+C-1;
				b=j+C-1;
				temp=sum[r][b]-sum[i-1][b]-sum[r][j-1]+sum[i-1][j-1];
				if(temp>max)
				{
					f=i;
					g=j;
					max=temp;
				}
			}
		pw.println(f+" "+g);
		pw.flush();
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 非常感谢您的提问,以下是用Java实现围棋的基本逻辑: 1. 定义棋盘和棋子类 首先我们需要定义棋盘类和棋子类。棋盘类需要保存棋盘的大小、已下棋子的位置等信息,而棋子类则需要保存棋子的颜色、位置等信息。定义棋盘类和棋子类的代码如下: ``` public class GobangBoard { private int size; // 棋盘大小 private int[][] board; // 棋盘状态,0表示空,1表示黑子,2表示白子 private boolean blackTurn; // 当前轮到黑子下棋吗? public GobangBoard(int size) { this.size = size; this.board = new int[size][size]; this.blackTurn = true; } public int getSize() { return size; } public int getPiece(int x, int y) { return board[x][y]; } public boolean isBlackTurn() { return blackTurn; } public boolean isValidMove(int x, int y) { return board[x][y] == 0; } public void makeMove(int x, int y) { board[x][y] = blackTurn ? 1 : 2; blackTurn = !blackTurn; } } public class GobangPiece { private int color; // 1表示黑子,2表示白子 private int x; private int y; public GobangPiece(int color, int x, int y) { this.color = color; this.x = x; this.y = y; } public int getColor() { return color; } public int getX() { return x; } public int getY() { return y; } } ``` 2. 实现下棋逻辑 下棋的逻辑主要包括玩家点击棋盘时的处理和电脑自动下棋时的处理。玩家点击棋盘时,我们需要判断是否是合法的落子位置,如果是,则将该位置标记为已下棋子,并更新棋盘状态。电脑自动下棋时,我们需要实现一个简单的AI算法选择最优落子位置。具体的代码实现如下: ``` public class GobangGame { private GobangBoard board; public GobangGame(int size) { board = new GobangBoard(size); } public GobangBoard getBoard() { return board; } public boolean makeMove(int x, int y) { if (!board.isValidMove(x, y)) { return false; } board.makeMove(x, y); return true; } public void computerMove() { int size = board.getSize(); int bestX = 0; int bestY = 0; int maxScore = -1; for (int x = 0; x < size; x++) { for (int y = 0; y < size; y++) { if (board.isValidMove(x, y)) { int score = evaluateMove(x, ### 回答2: 围棋是一种古老而复杂的棋类游戏,现在我将用300字来简要介绍使用Java编写围棋游戏的实现逻辑。 首先,我们需要一个棋盘的数据结构来表示围棋棋盘。可以使用一个二维数组来表示棋盘,数组元素的值表示该点的状态,比如0表示空点,1表示黑棋,2表示白棋。这样我们就可以轻松地表示围棋棋盘上的各个点。 接下来,我们需要实现下棋的逻辑。通过鼠标点击事件或者键盘输入,我们可以获取到玩家下棋的位置。然后判断该点是否为空点,如果为空,就将该点的值设置为当前玩家的棋子颜色。接着,还需要判断是否有任何棋子被吃掉,这种判断可以通过搜索算法,例如DFS或BFS来实现。判断的依据是从当前棋子位置出发,搜索相邻的同色棋子,并记录已访问过的点。最后,根据搜索过程中记录的已访问过的点,判断是否有棋子被吃掉,如果有,就将这些被吃掉的棋子颜色置为0。 除了下棋逻辑,还需要实现一些其他的功能,比如判断胜负、计算得分等。判断胜负的方法可以通过搜索算法实现,比如DFS或BFS。计算得分一般是根据控制的领地大小,其中领地是指某一方棋子所包围的区域。 最后,还需要实现一个图形界面来显示棋盘和棋子的状态。可以使用Java Swing或JavaFX等库来实现图形界面。在界面上,可以通过处理鼠标点击事件来下棋,同时,还可以显示游戏得分、显示当前玩家、显示棋盘等信息。 总结起来,实现围棋游戏的逻辑主要包括棋盘的数据结构、下棋逻辑、胜负判断、得分计算以及图形界面的设计和事件处理。通过这些逻辑的实现,我们可以让玩家在Java编写的围棋游戏中愉快地对弈。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值