WUSTOJ 1235: 计算矩阵的鞍点(Java)

80 篇文章 18 订阅
32 篇文章 0 订阅

1235: 计算矩阵的鞍点

题目

  输出二维数组中行上为最大,列上为最小的元素(称为鞍点)及其位置(行列下标)。如果不存在任何鞍点,请输出"404 not found"(不带引号)。更多内容点击标题。

分析

  没什么好分析的,只要看懂下面这几组数据就明白了。

输入
2
2 2
1 1
1 1

2 2
2 3
1 3
输出
1 1 1
1 1 2
1 2 1
1 2 2
3 1 2
3 2 2
代码
/**
 * time 1248ms
 * @author PengHao
 * @version A2.0
 * @date 2019-04-21 下午8:16:45
 */

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;

public class Main {

	/**
	 * Input and Output
	 * 
	 * @author PengHao
	 * @version 1.0
	 * @date 2019年4月21日 下午7:14:20
	 */
	private static class IO {
		// 输入部分
		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader br = new BufferedReader(isr);
		StreamTokenizer st = new StreamTokenizer(br);

		public int nextInt() {
			try {
				st.nextToken();
			} catch (IOException e) {
				e.printStackTrace();
			}
			return (int) st.nval;
		}

		// 输出部分
		OutputStreamWriter osw = new OutputStreamWriter(System.out);
		PrintWriter pw = new PrintWriter(osw);

		void print(int x) {
			pw.print(x);
			pw.flush();
		}

		void print(String s) {
			pw.print(s);
			pw.flush();
		}

		void println() {
			pw.println();
			pw.flush();
		}

		void println(String s) {
			pw.println(s);
			pw.flush();
		}

		void println(int a, int x, int y) {
			print(a);
			print(" ");
			print(x);
			print(" ");
			print(y);
			println();
		}
	}

	private IO io = new IO();
	private int n, m;
	private int[][] matrix; // 矩阵

	public Main() {
		int t;
		matrix = new int[23][23];
		boolean flag;
		t = io.nextInt();
		while ((t--) > 0) {
			input();
			flag = true; // 初始没找到鞍点
			for (int i = 1; i <= n; i++) {
				for (int j = 1; j <= m; j++) {
					if (largest(i, j) && smallest(i, j)) {
						io.println(matrix[i][j], i, j);
						flag = false;
					}
				}
			}
			if (flag) {
				io.println("404 not found");
			}
		}
	}

	/**
	 * Input data
	 */
	private void input() {
		n = io.nextInt();
		m = io.nextInt();
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= m; j++) {
				matrix[i][j] = io.nextInt();
			}
		}
	}

	/**
	 * @param x 行下标
	 * @param y 列下标
	 * @return true 如果这个数是这一行最大的数
	 */
	private boolean largest(int x, int y) {
		for (int j = 1; j <= m; j++) {
			if (matrix[x][j] > matrix[x][y]) {
				return false;
			}
		}
		return true;
	}

	/**
	 * @param x 行下标
	 * @param y 列下标
	 * @return true 如果这个数是这一列最小的数
	 */
	private boolean smallest(int x, int y) {
		for (int i = 1; i <= n; i++) {
			if (matrix[i][y] < matrix[x][y]) {
				return false;
			}
		}
		return true;
	}

	public static void main(String[] args) {
		new Main();
	}

}
代码补充

  类IO有点长,就是个输入输出的功能,同Scanner(输入)和println(输出)一样,我只是听说Scanner读取比较慢,就用的这种方法。


写在最后:

  1. 如需转载,请于标题下注明链接形式的wowpH的博客即可;
  2. 代码原创,如需公开引用,不能删除首行注释(作者,版本号,时间等信息)。
  3. 如果有疑问欢迎评论留言,尽力解答。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值