Contest1217 - [C4]-期末复习

2023-08-04 18:00:00
2023-08-31 22:00:00
已结束 公开 当前时间:2024-11-10 12:01:44
题目编号 标题
A【入门】算24点
B【基础】人造星空
C【基础】奇怪的电梯
D【提高】钱币兑换
E【提高】简单背包问题

信息与公告

全排列模板
#include<bits/stdc++.h>
using namespace std;
int n;
int a[1000],  vis[1000]; //a是存全排列的 vis存是否出现过
void dfs(int d){   //d代表第几个数字
	if(d>n){       //假设n是4 d为5代表第5个数字,这时前4个已经设置到了
		for(int i=1;i<=n;i++) //相应的应用
			printf("%d ",  a[i]);
		cout<<endl;
		return;    //别忘了return
	}
	for(int i=1;i<=n;i++){       //设置当前第d个数字,可能是1~n的某一个
		if(!vis[i]){             //i这个数字没有在a数组中、没有被选过 
			a[d] = i; vis[i] = 1;//第d个数字是i,且标记i被选了 
			dfs(d+1);            //选下一个数字
			vis[i] = 0;          //“归”时将重新设置第d个数字进行尝试
		}                        //所以之前设置的i取消标记
	}
}
int main(){
	cin>>n;//n个数字
	dfs(1);//从第1个数字开始设置 
	return 0;
}
DFS
#include<bits/stdc++.h>
#define ll long long
using namespace std;
//      maze 迷宫的意思,存地图  vis visit 访问,是否访问过这个点 
int n, m, maze[110][110], vis[110][110], ans;
int dx[8]={1, -1, 0, 0, 1, 1, -1, -1};//dx[i] 第i个方向行坐标变化
int dy[8]={0, 0, 1, -1, 1, -1, 1, -1};//dy[i] 第i个方向列坐标变化
bool in(int x,  int y){//是否在界内 
	return 1 <= x && x <= n && 1 <= y && y <= m;
}
int dfs(int x,  int y){//从x,y走到相邻点 
	if(到达终点){//先判断结束条件 
		
	}
	for(int i=0;i<4;i++){//上下左右4个方向写4 8个方向写8
		int tx=x+dx[i];
		int ty=y+dy[i];
		if(in(tx, ty)&&!vis[tx][ty]&&其他条件){
			vis[tx][ty]=1;//标记已访问
			dfs(tx, ty);   //递归前往下一个点 
			//上一行dfs执行结束后 从下一个点回来 
			vis[tx][ty]=0;//回头时可能需要撤销标记
		}
	}
//	return ;//这里返回的是这条路走不通时  这条路指的是从(x, y)出发往上下左右走
}
int main(){
	cin>>n>>m;//n行,m列   n行n列时这样写 cin>>n; m=n;
	for(int i=1;i<=n;i++){//地图模拟类的下标都从1开始,防越界 
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
		}
	}
	for(){
		for(){
			//找起点,随后开始搜索
			//cout<<dfs(i, j);//可能需要输出,可能只是统计 
		}
	}
	cout<<ans;//统计时 用ans统计
	return 0;
}
BFS
#include<bits/stdc++.h>
using namespace std;
struct node{
	int x, y, d;//xy坐标 d:步数  不一定是地图中,不一定要步数
};
queue<node> q;//队列
int vis[100][100];//vis 也可以是二维的 
int dir[4][2]={{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
int main(){
	//输入地图、找起点等 
	
	//开始广搜 
	q.push(node{1, 1, 0});//放入起点 假设起点是1,1 
	vis[1][1]=1;//标记起点 
	while(q.size()){//当队列内还有任务时 
		node f=q.front();//获得任务队列的第一个
		q.pop();//队列中删除第一个
		if(f.x==114&&f.y==514){//根据题目判断 当前点对结果的影响
			
		}
		//搜索周围的点
		for(int i=0;i<4;i++){//4个方向 或其他情况 
			int tx=f.x+dir[i][0];
			int ty=f.y+dir[i][1];
			if(vis[tx][ty]==0/*&&在地图内,等条件*/){
				q.push(node{tx, ty, f.d+1});//新node放入队列中,步数+1
				vis[tx][ty]=1;//每个点只会被放进队列中一次 
			}
		}
	}
//	cout<<ans; //输出结果 
	return 0;
}