计算三个矩形相交的面积
输入数据:左上角x坐标 y坐标 矩形宽 矩形高
思路就是
写一个矩形类, 类里写和另一个矩形比较重叠的方法, 这个方法返回的是重叠的矩形 ,
类里要有坐标信息字段,判断自身是不是一个矩形,然后类里写一个方法计算自身面积
array = []#一个空数组
for i in range(3):#三个矩形 插入三次
array.append([int(n) for n in input().split()])
#input()输入进来强制字符串类型,split()切片得到字符串列表,也可以理解成一维数组
#for 方法把列表中的元素一个单独取出来,取出来的同时使用int()方法给转成整形
#最后用[]把内容框起来成为一个一维数组插入到array数组里
class Rec:#矩形类
@classmethod #实例化对象用 可以用来调用类的属性,类的方法,实例化对象等。
def initByWH(cls, x, y, w, h):#cls是这个类本身 左上x 左上y 宽 高
x2 = x + w
y2 = y - h
return cls(x, y, x2, y2)#返回左上x 左上y 右下x 右下y
def __init__(self, x1, y1, x2, y2):#初始化方法
self.x1 = x1
self.y1 = y1
self.x2 = x2
self.y2 = y2
self.w = x2 - x1
self.h = y1 - y2
def getSize(self):#计算面积
return self.w * self.h
def valid(self):#认可函数,如果左上x小于等于右下x 且左上y大于等于右下y
return self.x1 <= self.x2 and self.y1 >= self.y2
def getOverlap(self, rec):#比较后,获取重叠矩形的四个点
resultX1 = rec.x1 if rec.x1 > self.x1 else self.x1#左上x选 x值大的那个
resultX2 = rec.x2 if rec.x2 < self.x2 else self.x2#右下x选 x值小的那个
resultY1 = rec.y1 if rec.y1 < self.y1 else self.y1#左上y选 y值小的那个
resultY2 = rec.y2 if rec.y2 > self.y2 else self.y2#右下y选 y值大的那个
result = Rec(resultX1, resultY1, resultX2, resultY2)
if result.valid():#如果新的矩形四个点符合逻辑就返回参数,不符合return None程序结束
return result
return None
rec1 = Rec.initByWH(array[0][0],array[0][1],array[0][2],array[0][3])#实例化三个矩形
rec2 = Rec.initByWH(array[1][0],array[1][1],array[1][2],array[1][3])
rec3 = Rec.initByWH(array[2][0],array[2][1],array[2][2],array[2][3])
temp = rec1.getOverlap(rec2)#获取第一个和第二个矩形得到的重叠的矩形
result = temp.getOverlap(rec3)#把得到的重叠矩形和第三个矩形继续重叠
print(result.getSize())#计算最后的重叠面积
实现金字塔输出 奇数行正序输出 偶数行逆序输出 不足四位需要用*补位
具体思路:
首先是一个外循环-控制行数,并准备一个空列表记录该行要输出的内容
接着内循环,输出该行的相应个数的数据,从第一行开始,是第几行就输出几个数据,利用一个全局变量s,记录目前输出的数据,需要输出就自增1,并且如果s不足4位要执行补位,为了,每生成完一个数就插入到空列表里
做完该行要输出的所有数据后,为了实现金字塔输出需要在最前面插入空格,空格的数量由目标行数减去当前行数决定
最后根据行数是奇数还是偶数决定列表是正序输出还是逆序输出
count = int(input())
sum = 0
for i in range(1,count+1):#i的意义是该行的输出个数
list = []
for j in range(i): #这行输出多少个
sum += 1 #sum是输出的数字
s = str(sum).ljust(4,"*") #处理不足4位补位
#ljust() 方法返回一个原字符串左对齐,并使用空格填充至指定长度的新字符
s = s
list.append(s) #添加到list
if i != count: #不是最后一行
for time in range(count-i): #输出前的空格个数
print(' ',end='') #end='' 为不换行输出
if i%2==1: #奇数行正序输出
for s in list:
print(s,end = ' ')
else: #偶数行逆序输出
for s in list[::-1]:
print(s,end = ' ')
print()#换行
贪吃蛇
思路:
首先获取操作,然后生成地图,然后往地图上放东西,然后才开始找起点,遍历操作,计算结果 判断结果
package Huawei;
import java.util.LinkedList;
import java.util.Scanner;
/**
* @description:
* @author: Polaris
* @date: 2022/3/31 19:53
*/
public class no9 {
static char[][] arr =null;#二维数组
public static void main(String[] args) {#主函数
Scanner sc = new Scanner(System.in)
#Scanner sc = new Scanner(System.in);此句 表示从控制台获取数据,
#sc.hasNext() 表示你是否有输入数据,
#while语句块 表示当你输入数据的时候,就执行输出sc.next()(输出内容)
#所以只要你输入数据了,它就可以执行,
#具体的输入:
#GGG #G上U下D左L右 G当前方向前进
#33 #行 列
#FFF #H起始位置,F食物,E为空
#FFH
#EFE
#结局向左走了两步,吃到两个食物 第三步撞墙了,最后的长度为3
while (sc.hasNext()){
char[] ch = sc.nextLine().replaceAll(" ","").toCharArray();#ch是操作
int N = sc.nextInt();#NM生成地图
int M = sc.nextInt();
arr = new char[N][M];
for(int i =0;i<arr.length;i++){#往地图上塞东西
for(int j = 0;j<arr[i].length;j++){
arr[i][j] = sc.next().charAt(0);
}
}
fun(arr,ch);#fun方法先是找到蛇的起点
}
}
static void fun(char[][] arr,char[] ch){#fun方法先遍历地图找到蛇的起点
LinkedList<int[]> snake = new LinkedList<>();?
int[] start = new int[2];
//先遍历地图找到蛇的起点
for(int i=0;i<arr.length;i++){
for(int j=0;j<arr[i].length;j++){
if(arr[i][j] == 'H'){
start[0]=i;
start[1]=j;
break;
}
}
}
//起点入队
snake.add(start);
//遍历操作列表
for(int i =0;i<ch.length;i++){
int flag = 0;
if(ch[i]=='U'){
flag=1;#flag只是用来区分不同操作的
continue;
}else if(ch[i]=='D'){
flag=-1;
continue;
}else if(ch[i]=='L'){
flag=-2;
continue;
}else if(ch[i]=='R'){
flag=2;
continue;
}else if(ch[i]=='G'){
switch (flag){
case 1:
start[0]++;#start 起点位置
break;
case -1:
start[0]--;
break;
case 2:
start[1]++;
break;
case -2:
start[1]--;
break;
}
if(isEnd(snake,start)){#根据flag就是对应的操作,来移动蛇的头,就是start
#isEnd类判断是否结束
break;
}
//吃到,只加不减#然后判断是撞墙了终结了 还是吃到东西了,还是没吃也没死
#吃到就只加头到那个位置,没吃到还要把尾巴减一个
if(arr[start[0]][start[1]]=='F'){
snake.addFirst(start);
}else{
//没吃到,加头去尾
snake.addFirst(start);#snake是个二维数组的list
snake.removeLast();
}
}
}
System.out.println(snake.size());
}
static boolean isEnd(LinkedList<int[]> list,int[] a){#判断结束的方法,就是判断撞墙和撞自己
//撞墙了
if(a[0]>=arr.length||a[1]>=arr[0].length)
return true;
//撞到自己了
for(int[] i:list){
if(i[0]==a[0]&&i[1]==a[1])
return true;
}
return false;
}
}
8皇后
步骤1
步骤2
第二个皇后放在第二行第一列,然后判断是否与约束条件冲突,如果冲突,继续放在第二列,第三列直到找到一个合适的位置
步骤3
继续第三个皇后,同样是第一列,第二列直到第八个皇后也能放在一个不冲突的位置,算是找到一个正确解
步骤4
然后就开始回溯,一直到把第一个皇后放在第一列的所有正确解全都得到
步骤5
然后回头继续第把第一个皇后放在第二列,循环执行一到四,四个步骤
每次为下一个皇后,寻找合适的位置,就是试探。每次试探不到合理的位置,回头去改变前一个皇后的位置,就是回溯;排除没意义的试探,就是剪枝。上诉的解题过程,就是一个回溯法的思路。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'C2TR'
def conflict(state, nextColumn):
"""
判断下一行皇后位置是否与之前皇后的位置冲突
因为坐标是从0开始的,所以state的长度代表了下一行的行坐标
:param state:(7,4,6,0,2) 标记每行皇后所在的位置 (0,7)一行八列 (2,4) (3,6) (4,0) (5,2)
:param nextColumn:下一行的列坐标
:return:
"""
nextRow = rows = len(state) # 5----下一行 = 行数 =state的长度
for row in range(rows): # 0,1,2,3,4
# 获取当前行的列
column = state[row]
"""
如何判断是否冲突:
1. 如果列的差值为0,说明两皇后在同一列
2. 如果列的差值等于行的差值,说明两皇后在对角线上
"""
if abs(column - nextColumn) in [0, nextRow - row]:
return True
return False
# 采用生成器的方式来产生每一个皇后的位置,并用递归来实现下一个皇后的位置
def queens(num, state=()):#采用生成器的方式来产生每一个皇后的位置,并用递归思想实现回溯法计算出每一种结果的皇后的位置
"""
基于递归采用回溯算法,算出每一种结果
:param num: 皇后的数量 8
:param state: 列坐标。初始为空。参数为元组不为列表,因为参数只能为不可变数据类型
:return:
"""
# 每一行的列坐标都是从0:7的
# 0,1,2,3,4,5,6,7
for pos in range(num):#----循环8次
# 默认state为空。长度为0,但是是不冲突的
# 判断是否冲突,state为空时不冲突
if not conflict(state, pos): # 回溯法的体现----如果位置冲突判断函数返回值为false
# 如果state的长度为7,即到达了倒数第二行,也就是前7行皇后都已经找到了位置,最后一行又没有冲突,返回最后一行的列坐标
if len(state) == num - 1:#
# 最后一行的(pos,)=最后一行的result,然后再递归回去求倒数第二行的result
yield (pos,)
else:
for result in queens(num, state + (pos,)):
"""
递归实现求state:
1. 向下递归
第一次(行): pos=0,刚开始不会进入if len(state) == num - 1,进入执行else,会执行queens(num, state + (pos, )),
第二次(行): 进入else,再调用queens(num, state + (pos, )),递归执行queens(num, state + (pos,) + (pos,))
第三次(行): 进入else,再调用queens(num, state + (pos,) + (pos,),递归执行queens(num, state + (pos,) + (pos,) + (pos,))
...
第七次(行): 执行和上面的一样,不过此时state的长度为7
第八次(行): 执行f len(state) == num - 1:求出最后一行的列坐标(pos,)
2.向上递归
求出第八行的列坐标,就可以求出第七行的(pos,),返回的是第七行和第八行的列坐标((pos,) + result)
根据下一行的结果依次求出上一行的结果;
....
最后求出第一行的列坐标,返回整体结果
"""
yield (pos,) + result#生成器,编写当前次数和
def prettyprint(solution):#友好展示棋盘,画出每一种结果的皇后的位置
"""
进行友好展示:为了至关表现棋盘,用X表示皇后的位置
:param solution:
:return:
"""
def line(pos, length=len(solution)):
return '.' * (pos) + 'X' + '.' * (length - pos -1)
for pos in solution:
print(line(pos))
if __name__ == '__main__':
solutions = queens(8)
for index, solution in enumerate(solutions):
print('第%d种解决方案:' %(index + 1), solution )
prettyprint(solution)
print('*' * 50)