今天用又是准备国赛的一天,用蓝桥云课练了几道题,欢迎指正

1.小蓝有一条玩具蛇,一共有 1616 节,上面标着数字 1至 16。每一节都是一个正方形的形状。相邻的两节可以成直线或者成 90 度角

小蓝还有一个 4×4 的方格盒子,用于存放玩具蛇,盒子的方格上依次标着字母 A到 P 共 16 个字母。

小蓝可以折叠自己的玩具蛇放到盒子里面。他发现,有很多种方案可以将玩具蛇放进去。

下图给出了两种方案:

图片描述

Python七巧板代码 七巧板拼图蛇_Python七巧板代码

请帮小蓝计算一下,总共有多少种不同的方案。如果两个方案中,存在玩具蛇的某一节放在了盒子的不同格子里,则认为是不同的方案。

分析:这个题就是常规的dfs搜索,递归的入口是16个格子的任意一格,相邻的两节呈直线或90度角意思是任意一个格子(入口)上下左右搜索,直到这16个格子全部走完即为一种方案,走不下去就回溯回去。

#include<iostream>
 #include<cstring>
 using namespace std;
 //https://www.lanqiao.cn/problems/1022/learning/
 //该题链接
 int dir[4][2] = { 1,0,-1,0,0,1,0,-1 };//二位数组的上下左右
 //int dir[5] = {-1,0,1,0,-1};//一维数组
 int visit[5][5];//设访问标志位,开始全为0,即为未访问
 long long cnt;//计数
 
 //x为横坐标,y为竖坐标,step为当前节数
 void dfs(int x, int y, int step)
 {
	 if (step == 16)//全部放下 
	 {
	   cnt++;
	   return;
    }
    
 	for (int i = 0; i < 4; i++)//i < 4 注意边界 
 	{
 	    //更新坐标
 		int xx = dir[i][0] + x;
 		int yy = dir[i][1] + y;
 		//int xx = dir[i] + x;
 		//int yy = dir[i+1] + y;
 		//if (xx < 1 || xx > 4 || yy < 1 || yy > 4 ||     visit[xx][yy]) continue;
 		if (xx >= 1 && xx <= 4 && yy >= 1 && yy <= 4 && visit[xx][yy] == 0)
 		{
 			visit[xx][yy] = 1;//设该点已访问
 			dfs(xx, yy, step+1);//节数加1
 			visit[xx][yy] = 0;//回溯
		 }
	 }
	
 }
 int main()
 {
 	for (int i = 1; i <= 4; i++)
 	for (int j = 1; j <= 4; j++)
 	{
 	    //存在玩具蛇的某一节放在了盒子的不同格子里
 	    //,则认为是不同的方案。
 	    // dfs的入口,即16个格子的任一各
 		memset(visit, 0, sizeof(visit));
 		//每次dfs先把标志为初始化为0
 		visit[i][j] = 1;
 		dfs(i,j,1);
	 }
	cout << cnt << endl;
 	return 0;
  }

2.

Python七巧板代码 七巧板拼图蛇_ios_02


Python七巧板代码 七巧板拼图蛇_i++_03


Python七巧板代码 七巧板拼图蛇_Python七巧板代码_04

网址:https://www.lanqiao.cn/problems/1025/learning/
分析:刚开始没有理解题意,题中所说的发消息时间之和最小是什么意思,不是忽略掉发消息时间吗。
其实是第一位同学发消息时间为他s+a,第二为同学发消息时间为前面同学所用总时间加上自己的s+a,所以要是总的发消息时间最少,必须按每一个同学所用总时间一次排序。

#include<iostream>
 #include<algorithm>
 using namespace std;
  struct time
 {
 	long long s;//进入办公室时间
 	long long a;//答疑时间
 	long long e;//离开办公室时间
 	long long sum;//总的时间
 };
 struct time t[1001];
 int sortHelper(struct time t1, struct time t2)
 {
 	return t1.sum < t2.sum;//降序
  } 
 int main()
 {
 	int n = 0;
 	cin >> n;
 	for (int i = 0; i < n; i++)
 	{
 	 	cin >> t[i].s >> t[i].a >> t[i].e;
 		t[i].sum = t[i].s + t[i].a + t[i].e;
	 }
	 sort(t,t+n,sortHelper);//排序
	 long long sum = 0;
//	 for (int i = 0; i < n; i++)
//	 {
//	 	cout << t[i].s << " " << t[i].a << " " << t[i].e << " " << t[i].sum << endl; 
//	 }
     for (int i = 0; i < n; i++)
     {
     	long long temp = 0; 
     	for (int j = 0; j < i; j++)
     	{
     		temp += t[j].sum;//前面同学所用总时间
		 }
		 sum = sum + temp + t[i].s + t[i].a;//加上s+a
	 }
	 cout << sum << endl;
 	return 0;
 }

3.一个数如果除了 1 和自己还有其他约数,则称为一个合数。例如:1, 2, 31,2,3 不是合数,4, 64,6 是合数。

请问从 1 到 2020 一共有多少个合数。

运行限制
最大运行时间:1s
最大运行内存: 128M
链接:https://www.lanqiao.cn/problems/1028/learning/合数个数

分析:这道题目很简单,但一开始结果就是不正确
素数就是除了1和它本身没有其他约数,所以合数就是求不是素数的个数。

#include<iostream>
#include<cmath>
using namespace std;
int isPrime(int n)
{
	for (int i = 2; i <= sqrt(n); i++)
	{
		if (n % i == 0) return 0;
	}
	return 1;
}
int main()
{
	int cnt = 0;
	for (int i = 1; i <= 2020; i++)
	{
		if (!isPrime(i)) cnt++;
	}
	cout << cnt << endl;
	
	return 0;
 }