CCF通过测试的代码 2013-12(2)

最大的矩形

问题描述
  在横轴上放了n个相邻的矩形,每个矩形的宽度是1,而第i(1 ≤ i ≤ n)个矩形的高度是hi。这n个矩形构成了一个直方图。例如,下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3。
在这里插入图片描述
  请找出能放在给定直方图里面积最大的矩形,它的边要与坐标轴平行。对于上面给出的例子,最大矩形如下图所示的阴影部分,面积是10。
在这里插入图片描述

输入格式
  第一行包含一个整数n,即矩形的数量(1 ≤ n ≤ 1000)。
  第二行包含n 个整数h1, h2, … , hn,相邻的数之间由空格分隔。(1 ≤ hi ≤ 10000)。hi是第i个矩形的高度。
  
输出格式
  输出一行,包含一个整数,即给定直方图内的最大矩形的面积。
  
样例输入
6
3 1 6 5 2 3

样例输出
10

n = input()
nnum = int(n)
sq = input()
sqslist = sq.split()
sqlist = []
for sqs in sqslist:
    sqn = int(sqs)
    sqlist.append(sqn)

sqns = 0
outsqs = 0
for i in range(len(sqlist)):
    if sqlist[i] > outsqs:
        outsqs = sqlist[i]

for i in range(1,len(sqlist)+1): #遍历矩阵

    for j in range(0,len(sqlist)+1-i):
        outlist = sqlist[j:j+i]
        outlen = len(outlist)

        minlen = min(outlist)
        numsqs = minlen*outlen
        if numsqs > outsqs:
            outsqs = numsqs
print(outsqs)

I’m stuck!

问题描述
  给定一个R行C列的地图,地图的每一个方格可能是’#‘, ‘+’, ‘-’, ‘|’, ‘.’, ‘S’, ‘T’七个字符中的一个,分别表示如下意思:
  ‘#’: 任何时候玩家都不能移动到此方格;
  ‘+’: 当玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非’#‘方格移动一格;
  ‘-’: 当玩家到达这一方格后,下一步可以向左右两个方向相邻的一个非’#‘方格移动一格;
  ‘|’: 当玩家到达这一方格后,下一步可以向上下两个方向相邻的一个非’#‘方格移动一格;
  ‘.’: 当玩家到达这一方格后,下一步只能向下移动一格。如果下面相邻的方格为’#’,则玩家不能再移动;
  ‘S’: 玩家的初始位置,地图中只会有一个初始位置。玩家到达这一方格后,下一步可以向上下左右四个方向相邻的任意一个非’#‘方格移动一格;
  ‘T’: 玩家的目标位置,地图中只会有一个目标位置。玩家到达这一方格后,可以选择完成任务,也可以选择不完成任务继续移动。如果继续移动下一步可以向上下左右四个方向相邻的任意一个非’#‘方格移动一格。
  此外,玩家不能移动出地图。
  请找出满足下面两个性质的方格个数:
  1. 玩家可以从初始位置移动到此方格;
  2. 玩家不可以从此方格移动到目标位置。
  
输入格式
  输入的第一行包括两个整数R 和C,分别表示地图的行和列数。(1 ≤ R, C ≤ 50)。
  接下来的R行每行都包含C个字符。它们表示地图的格子。地图上恰好有一个’S’和一个’T’。
  
输出格式
  如果玩家在初始位置就已经不能到达终点了,就输出“I’m stuck!”(不含双引号)。否则的话,输出满足性质的方格的个数。
  
样例输入
5 5

--+-+
..|#.
..|##
S-+-T
####.

样例输出
2

样例说明
  如果把满足性质的方格在地图上用’X’标记出来的话,地图如下所示:

--+-+
..|#X
..|##
S-+-T
####X
package CCF;

import java.util.*;

public class thirteen_five {
	public static void  main(String args[]) {
		Scanner myint = new Scanner(System.in);
		int m = myint.nextInt();
		int n = myint.nextInt();
		strgo[][] all = new strgo[m][n];
		int startx = 0,starty = 0;
		char c;
		for(int i=0;i<m;i++) {
			String string = myint.next();
			for(int j=0;j<n;j++) {
				c = string.charAt(j);
				all[i][j] = new strgo();
				all[i][j].getit(i, j, c);
				if(c == 'S') {
					startx = i;
					starty = j;
				}
			}
		}
		laby mylaby = new laby(all, m, n);
		mylaby.changstrgo(all);
		gostart(startx,starty,mylaby);
		myint.close();
	}
	
	static boolean tflag = false;
	static ArrayList<Integer> ex = new ArrayList<Integer>();
	static ArrayList<Integer> ey = new ArrayList<Integer>();
	public static void gonext(laby mylaby,int x,int y) {
		mylaby.all[x][y].visited = true;
		if(mylaby.all[x][y].c == 'T') {
			tflag = true;
		}

		if(y-1 >= 0 && mylaby.visitleft(mylaby.all[x][y])) {
			gonext(mylaby,x,y-1);
		}
		if(y+1 < mylaby.n && mylaby.visitright(mylaby.all[x][y])) {
			gonext(mylaby,x,y+1);
		}
		if(x-1 >= 0 && mylaby.visitup(mylaby.all[x][y])) {
			gonext(mylaby,x-1,y);
		}
		if(x+1 < mylaby.m && mylaby.visitdown(mylaby.all[x][y])) {
			gonext(mylaby,x+1,y);
		}
			
		ex.add(x);
		ey.add(y);//System.out.println(x+" "+y);
	}
	
	public static void gostart(int startx,int starty,laby mylaby) {
		mylaby.all[startx][starty].visited = true;
		if(mylaby.visitleft(mylaby.all[startx][starty])) {//System.out.println("xxx1");
			if(starty-1 >= 0) {
				gonext(mylaby,startx,starty-1);
			}
		}
		if(mylaby.visitright(mylaby.all[startx][starty])) {//System.out.println("xxx2");			
			if(mylaby.n > starty+1) {
				gonext(mylaby,startx,starty+1);
			}
		}
		if(mylaby.visitup(mylaby.all[startx][starty])) {//System.out.println("xxx3");			
			if(startx-1 >= 0) {
				gonext(mylaby,startx-1,starty);
			}
		}
		if(mylaby.visitdown(mylaby.all[startx][starty])) {//System.out.println("xxx4");	
			if(mylaby.m > startx+1) {
				gonext(mylaby,startx+1,starty);
			}
		}
		
		if(tflag) {
			int num = 0;
			for(int i=0;i<ex.size();i++) {
				tflag = false;
				mylaby.rebuild();
				findway(ex.get(i),ey.get(i),mylaby);
				if(!tflag) {
					num++;
				}
			}
			System.out.println(num);
		}
		else {
			System.out.println("I'm stuck!");
		}
	}
	
	public static void findway(int x,int y,laby mylaby) {
		mylaby.all[x][y].visited = true;
		if(mylaby.all[x][y].c == 'T') {
			tflag = true;
			return;
		}
		
		if(mylaby.visitleft(mylaby.all[x][y])) {
			findway(x,y-1,mylaby);
		}
		if(mylaby.visitright(mylaby.all[x][y])) {
			findway(x,y+1,mylaby);
		}
		if(mylaby.visitup(mylaby.all[x][y])) {
			findway(x-1,y,mylaby);
		}
		if(mylaby.visitdown(mylaby.all[x][y])) {
			findway(x+1,y,mylaby);
		}
	}
}

class laby{
	int m,n;
	strgo[][] all;

	public laby(strgo[][] all,int m,int n) {
		this.m = m;
		this.n = n;
		this.all = all;
	}
	
	public void rebuild() {
		for(int i=0;i<m;i++) {
			for(int j=0;j<n;j++) {
				all[i][j].visited = false;
			}
		}
	}
	
	public void changstrgo(strgo[][] all) {
		for(int i=0;i<m;i++) {
			for(int j=0;j<n;j++) {
				if(i == 0) {
					all[i][j].up = false;
				}
				else {
					if(all[i-1][j].c == '#') {
						all[i][j].up = false;
					}
				}
				if(i == m-1) {
					all[i][j].down = false;
				}
				else {
					if(all[i+1][j].c == '#') {
						all[i][j].down = false;
					}
				}
				if(j == 0) {
					all[i][j].left = false;
				}
				else {
					if(all[i][j-1].c == '#') {
						all[i][j].left = false;
					}
				}
				if(j == n-1) {
					all[i][j].right = false;
				}
				else {
					if(all[i][j+1].c == '#') {
						all[i][j].right = false;
					}
				}
			}
		}
	}
	
	public boolean visitleft(strgo itself) {
		if(itself.left) {
			if(itself.y != 0 && !all[itself.x][itself.y-1].visited) {
				return true;
			}
		}
		return false;
	}
	
	public boolean visitright(strgo itself) {
		if(itself.right) {
			if(itself.y != n-1 && !all[itself.x][itself.y+1].visited) {
				return true;
			}
		}
		return false;
	}
	
	public boolean visitup(strgo itself) {
		if(itself.up) {
			if(itself.x != 0 && !all[itself.x-1][itself.y].visited) {
				return true;
			}
		}
		return false;
	}
	
	public boolean visitdown(strgo itself) {
		if(itself.down) {
			if(itself.x != m-1 && !all[itself.x+1][itself.y].visited) {
				return true;
			}
		}
		return false;
	}
}

class strgo{
	int x,y;
	char c;
	boolean left = false;
	boolean right = false;
	boolean up = false;
	boolean down = false;
	boolean visited = false;

	public void getit(int x,int y,char c) {
		this.c = c;
		this.x = x;
		this.y = y;
		if(c == 'S' || c == 'T' || c == '+') {
			left = true;
			right = true;
			up = true;
			down = true;
		}
		else if(c == '-') {
			left = true;
			right = true;
		}
		else if(c == '|') {
			up = true;
			down = true;
		}
		else if(c == '.') {
			down = true;
		}
	}
}
  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值