Blue Bridge Cup Countdown bis zum sechsten Tag der täglichen Überprüfung des nationalen

Hallo zusammen, ich bin Bubble, heute ist der sechste Tag der Überprüfung! Ich habe heute etwas zu tun, nimm ein bisschen Wasser

Inhalt

1. Labyrinth

2. Das Problem der Zerlegung natürlicher Zahlen


1. Labyrinth

Themenlink : P1605 Labyrinth – Luogu | New Ecology of Computer Science Education (luogu.com.cn)

Themenanforderungen:

Bei einem gegebenen Labyrinth aus N*M Quadraten gibt es T Hindernisse im Labyrinth, und die Hindernisse können nicht passiert werden. Fragen Sie angesichts der Koordinaten des Start- und Endpunkts: Jedes Quadrat geht höchstens einmal durch, wie viele Lösungen gibt es von der Startpunktkoordinate bis zur Endpunktkoordinate. Es gibt vier Möglichkeiten, sich im Labyrinth zu bewegen, und Sie können sich jeweils nur um ein Feld bewegen. Daten garantieren, dass es keine Hindernisse für den Start gibt.

Ideen zur Problemlösung:

nackte dfs

#include<bits/stdc++.h>
using namespace std;
int a[101][101];
int sum=0;
int n,m,t,sx,sy,fx,fy,ex,ey;
void dfs(int x,int y)
{
	if(x<1||x>n||y<1||y>m)//越界问题 
	{
		return ;
	}
    if(x==fx&&y==fy)//如果到了终点就++ 
    {
        sum++;
        return;
    }
    if(a[x][y]==1||a[x][y]==2)//如果走过或者是有障碍就返回 
    {
    	return ;
	}
	a[x][y] = 1;//标记 
	dfs(x+1,y);//下 
	dfs(x,y+1);//右 
	dfs(x-1,y);//上 
	dfs(x,y-1);//左 
	a[x][y] = 0;//回溯 
}
int main()
{
    cin>>n>>m>>t;//输入 迷宫大小和障碍数量 
    cin>>sx>>sy>>fx>>fy;//sxsy是起点fxfy是终点 
    for(int i=0;i<t;i++)//输入障碍位置 
    {
        cin>>ex>>ey;
        a[ex][ey]=2;//标记障碍为2 
    }
    if(a[fx][fy]==2)//如果终点有障碍就G 
    {
    	cout<<0;
    	return 0;
	}
    dfs(sx,sy);//深度搜索 
    cout<<sum;
    return 0;
}

2. Das Problem der Zerlegung natürlicher Zahlen

Themenlink : P2404 Splitting of Natural Numbers – Luogu | New Ecology of Computer Science Education (luogu.com.cn)

Themenanforderungen:

Jede natürliche Zahl n größer als 1 kann immer in die Summe mehrerer natürlicher Zahlen kleiner als n geteilt werden. Jetzt ist Ihnen eine natürliche Zahl n gegeben, und Sie werden gebeten, die Summe der Divisionen von n in einige Zahlen zu finden. Die Zahlen in jeder geteilten Sequenz werden von der kleinsten zur größten sortiert. Dann müssen Sie diese Sequenzen ausgeben, wobei die lexikografisch kleine Sequenz zuerst ausgegeben werden muss.

Ideen zur Problemlösung:

volles Array

#include<bits/stdc++.h>
using namespace std;
int n,a[10];
void print(int x)
{
	for(int i=0;i<x;i++)
	{
		if(i==0)
		{
			cout<<a[i];
		}
		else
		{
			cout<<"+"<<a[i];
		}
	}
	cout<<endl;
	return;
}
void dfs(int x,int y,int z)
{
	if(x==n)
	{
		return ;
	}
	if(y==n)
	{
		print(z);
		return ;
	}
	for(int i=x;i<=n-y;i++)
	{
		a[z] = i;
		dfs(i,y+i,z+1);
	}
}
int main()
{
	cin>>n;
	dfs(1,0,0);
	return 0;
}

Ich denke du magst

Origin blog.csdn.net/qq_45400861/article/details/124028564
Empfohlen
Rangfolge