编程语言
首页 > 编程语言> > 洛谷题单 【算法1-7】搜索

洛谷题单 【算法1-7】搜索

作者:互联网


P1219 [USACO1.5]八皇后 Checker Challenge

绿色为列标号,记 \(lie[i]\)为列标记;

红色为主对角线标号,记 \(zhu[i]\)为主对角线标记;

蓝色为次对角线标号,记\(ci[i]\)为次对角线标记;

观察\((1,1)\)位置,它在\(3\)号主对角线上。

向右移动到\((1,2)\)位置,它就变为在\(2\)号主对角线上,可以确认 列标号与主对角线负相关;

向下移动到\((2,1)\)位置,它就变为在\(4\)号主对角线上,可以确认 行标号与主对角线正相关;

主对角线共\(2*n-1\)条,可以猜想到位置与主对角线标号互换关系为\((x,y) \to n-i+x\)

同理,观察\((1,1)\)位置,它在\(1\)号次对角线上,

向右移动到\((1,2)\)位置,它就变为在\(2\)号次对角线上,可以确认 列标号与次对角线正相关;

向下移动到\((2,1)\)位置,它就变为在\(2\)号次对角线上,可以确认 行标号与次对角线正相关;

次对角线共\(2*n-1\)条,可以猜想到 位置与次对角线标号互换关系为\((x,y) \to i+x-1\)

P1219.cpp

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,tot,ans[14],lie[14],zhu[25],ci[25];
void dfs(int x){
	if(x>n){
		++tot;
		if(tot<=3){
			for(int i=1;i<=n;++i) printf("%d ",ans[i]);
			putchar('\n');
		}
		return;
	} else {
		for(int i=1;i<=n;++i)
			if(lie[i]==0 && ci[i+x-1]==0 && zhu[n-1-i+x]==0){
				ans[x]=i;
				lie[i]=ci[i+x-1]=zhu[n-1-i+x]=1;
				dfs(x+1);
				lie[i]=ci[i+x-1]=zhu[n-1-i+x]=0;
			}
	}
}
int main(){
	scanf("%d",&n);
	dfs(1);
	printf("%d",tot);
	return 0;
}

P2392 kkksc03考前临时抱佛脚

P2392 DFS.cpp

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<climits>
//使用 INT_MAX 需要 使用#include<climits>头文件 
using namespace std;
int s[5],a[5][21],totr,totl,res,ans;
bool vis[5][21];
void dfs(int k,int x){
	if(x>s[k]){
		res=min(res,max(totl,totr));
		return;
	} else {
		totl+=a[k][x];
		dfs(k,x+1);
		totl-=a[k][x];
		totr+=a[k][x];
		dfs(k,x+1);
		totr-=a[k][x];
	}
}
int main(){
	for(int i=1;i<=4;++i) scanf("%d",&s[i]);
	for(int i=1;i<=4;++i){
		res=INT_MAX; totl=totr=0;
		for(int j=1;j<=s[i];++j) scanf("%d",&a[i][j]);
		dfs(i,1);
		ans+=res;
	}
	printf("%d",ans);
	return 0;
}

P2392 DP.cpp

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int s[5],a[65],f[1205],ans,sum;
int main(){
	for(int i=1;i<=4;++i) scanf("%d",&s[i]);
	for(int i=1;i<=4;++i){
		sum=0;
		memset(f,0,sizeof(f));
		for(int j=1;j<=s[i];++j){ scanf("%d",&a[j]); sum+=a[j]; }
		for(int j=1;j<=s[i];++j)
			for(int k=sum/2;k>=a[j];--k)
				f[k]=max(f[k],f[k-a[j]]+a[j]);
		ans+=sum-f[sum/2];
	}
	printf("%d",ans);
	return 0;
}

P1443 马的遍历

P1443.cpp

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int fx[]={2,2,-2,-2,1,1,-1,-1};
int fy[]={1,-1,1,-1,2,-2,2,-2};
int s[4000][4000],n,m,x,y;
void bfs(int x,int y){
	memset(s,-1,sizeof(s));
	queue<int>qx; queue<int>qy;
	qx.push(x); qy.push(y); s[x][y]=0;
	while(!qx.empty()){
		x=qx.front(); y=qy.front(); qx.pop(); qy.pop();
		for(int nx,ny,i=0;i<8;++i){
			nx=x+fx[i]; ny=y+fy[i];
			if(nx>0&&nx<=n&&ny>0&&ny<=m&&s[nx][ny]==-1){
				s[nx][ny]=s[x][y]+1;
				qx.push(nx); qy.push(ny);
			}
		}
	}
}
int main(){
	scanf("%d %d %d %d",&n,&m,&x,&y);
	bfs(x,y);
	for(int i=1;i<=n;++i){
		for(int j=1;j<=m;++j)
			printf("%-5d",s[i][j]);
		puts("");
	}
	return 0;
}

P1135 奇怪的电梯

标签:标号,int,洛谷题,sum,算法,搜索,对角线,include
来源: https://www.cnblogs.com/Potrem/p/Luogu_algorithm_1_7.html