搜索复习-基础水题

tyvj1080 N皇后

描述

检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。

列号
   1  2  3  4  5  6

  -------------------------

1 |  | O |  |  |  |  |

  -------------------------

2 |  |  |  | O |  |  |

  -------------------------

3 |  |  |  |  |  | O |

  -------------------------

4 | O |  |  |  |  |  |

  -------------------------

5 |  |  | O |  |  |  |

  -------------------------

6 |  |  |  |  | O |  |

  -------------------------

上面的布局可以用序列2 4 6 1 3 5来描述,第i个数字表示在第i行的相应位置有一个棋子,如下: 
行号 1 2 3 4 5 6 
列号 2 4 6 1 3 5 
这只是跳棋放置的一个解。请编一个程序找出所有跳棋放置的解。并把它们以上面的序列方法输出。解按字典顺序排列。请输出前3个解。最后一行是解的总个数。 
特别注意: 对于更大的N(棋盘大小N x N)你的程序应当改进得更有效。不要事先计算出所有解然后只输出(或是找到一个关于它的公式),这是作弊。如果你坚持作弊,那么你登陆tyvj的帐号将被无警告删除

输入格式

一个数字N (6 <= N <= 13) 表示棋盘是N x N大小的。

输出格式

前三行为前三个解,每个解的两个数字之间用一个空格隔开。第四行只有一个数字,表示解的总数。

测试样例1

输入

6

输出

2 4 6 1 3 5 
3 6 2 5 1 4 
4 1 5 2 6 3 
4

先水图论,现在又开始水搜索,感觉自己已经不会搜索了。

水~

//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=15;
int n,tot,ans[maxn];
bool l[maxn],jia[maxn*2],jian[maxn*2];

void p() {
	for(int i=1;i<=n;++i) printf("%d ",ans[i]);
	printf("\n");
}

void s(int pos) {
	if(pos==n+1) {
		if((++tot)<=3) p();
		return ;
	}
	for(int i=1;i<=n;++i) {
		if(l[i]||jia[pos+i]||jian[pos-i+n]) continue;
		l[i]=jia[pos+i]=jian[pos-i+n]=1;
		ans[pos]=i;s(pos+1);
		l[i]=jia[pos+i]=jian[pos-i+n]=0;
	}
}

int main() {
	cin>>n;
	s(1);
	cout<<tot;
	return 0;
}

  

codevs2080 特殊的质数肋骨

题目描述 Description

农民约翰的母牛总是产生最好的肋骨。 你能通过农民约翰和美国农业部标记在每根肋骨上的数字认出它们。 农民约翰确定他卖给买方的是真正的质数肋骨,是因为从右边开始切下肋骨,每次还剩下的肋骨上的数字都组成一个质数,举例来说: 7 3 3 1 全部肋骨上的数字 7331是质数;三根肋骨 733是质数;二根肋骨 73 是质数;当然,最后一根肋骨 7 也是质数。 7331 被叫做长度 4 的特殊质数。 写一个程序对给定的肋骨的数目 N(1<=N<=8),求出所有的特殊质数。 数字1不被看作一个质数。

输入描述 Input Description

单独的一行包含N。

输出描述 Output Description

按顺序输出长度为 N 的特殊质数,每行一个。

样例输入 Sample Input

4

样例输出 Sample Output

2333
2339
2393
2399
2939
3119
3137
3733
3739
3793
3797
5939
7193
7331
7333
7393

再来一发
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=10;
int n,ans[maxn];

bool ok(int x) {
	if(x==1) return 0;
	int y=sqrt(x);
	for(int i=2;i<=y;++i) if(x%i==0) return 0;
	return 1;
}

void s(int pos,long long x) {
	if(!ok(x)) return;
	if(pos==n+1) {
		printf("%lld\n",x);
		return;
	}
	for(int i=1;i<=9;++i) {
		ans[pos]=i;s(pos+1,x*10+i);
	}
}

int main() {
	cin>>n;
	s(1,0);
	return 0;
}

  

RQNOJ67 选数

题目描述

  已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为:

    3+7+12=22  3+7+19=29  7+12+19=38  3+12+19=34。

  现在,要求你计算出和为素数共有多少种。

  例如上例,只有一种的和为素数:3+7+19=29)。

输入格式

  键盘输入,格式为:

  n , k (1<=n<=20,k<n)

  x1,x2,…,xn (1<=xi<=5000000)

输出格式

  屏幕输出,格式为:

  一个整数(满足条件的种数)。

样例输入

4 3
3 7 12 19

样例输出

1

感觉还是弄一点不是这么无脑的搜索来刷好一点

//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=20+5;
int n,k,a[maxn],tot;

bool ok(int x) {
	if(x<=1) return 0;
	int y=sqrt(x);
	for(int i=2;i<=y;++i) if(x%i==0) return 0;
	return 1;
}

void s(int pos,int f,int x) {
	if(f==k) {
		if(ok(x)) tot++;
		return;
	}
	if(pos>n) return;
	s(pos+1,f,x);
	s(pos+1,f+1,x+a[pos]);
}

int main() {
	cin>>n>>k;
	for(int i=1;i<=n;++i) cin>>a[i];
	s(1,0,0);
	cout<<tot;
	return 0;
}

  

codevs1116 四色问题

题目描述

4色问题:对平面或球面的任何一幅地图,只需要使用4种颜色就可以给地图上的每个国家填色,使得任意2个有一段公共边界的国家所填的颜色是不同的。

输入

用邻接矩阵表示地图。读入格式如下:

N(有N个国家,N不超过20)

N行用空格隔开的0/1串(1表示相邻,0表示不相邻)

输出

最多的填色方案

样例输入

8
0 0 0 1 0 0 1 0
0 0 0 0 0 1 0 1
0 0 0 0 0 0 1 0
1 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0
1 0 1 0 0 0 0 0
0 1 0 0 0 0 0 0

样例输出

15552

感觉自己已经堕落了。。。

//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=20+5;
int n,cl[maxn],ans;
bool tu[maxn][maxn];

int get_f(int pos) {
	int x=15;
	for(int i=1;i<pos;++i) if(tu[i][pos])x-=(x&(1<<(cl[i]-1)));
	return x;
}

void s(int pos) {
	if(pos>n) {
		ans++;
		return;
	}
	int x=get_f(pos);
	for(int i=1;i<=4;++i) if(x&(1<<(i-1))) {
		cl[pos]=i;
		s(pos+1);
	}
}

int main() {
	cin>>n;
	for(int i=1;i<=n;++i) for(int j=1;j<=n;++j) cin>>tu[i][j];
	s(1);
	cout<<ans;
	return 0;
}

  

时间: 2024-10-12 16:57:50

搜索复习-基础水题的相关文章

【基础水题】统计单词个数

1 //1.统计单词的个数 2 #include <stdio.h> 3 int main(void) 4 { 5 int i, flag = 0, number = 0; 6 char str[20]; 7 printf("请输入一行字符串:"); 8 gets_s(str); 9 for (i = 0; str[i] != '\0'; i++) 10 { 11 if (str[i] == ' ') 12 flag = 0;//flag用来标记是否为空格 13 else

华为题 搜索水题 DFS

1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <string> 6 #include <iterator> 7 #include <algorithm> 8 #include <cstdlib> 9 #include <deque> 10 #include &l

Python 基础练习 PAT水题(二)

#学习笔记 #用以练习Python基础 # 原题链接:https://www.patest.cn/contests/pat-b-practise/1011 1011. A+B和C (15) 给定区间[-231, 231]内的3个整数A.B和C,请判断A+B是否大于C. 输入格式: 输入第1行给出正整数T(<=10),是测试用例的个数.随后给出T组测试用例,每组占一行,顺序给出A.B和C.整数间以空格分隔. 输出格式: 对每组测试用例,在一行中输出"Case #X: true"如果

Python 基础练习 PAT水题(三)

#学习笔记 #用以练习python基础 # 原题链接:https://www.patest.cn/contests/pat-b-practise/1039 1039. 到底买不买(20) 小红想买些珠子做一串自己喜欢的珠串.卖珠子的摊主有很多串五颜六色的珠串,但是不肯把任何一串拆散了卖.于是小红要你帮忙判断一下,某串珠子里是否包含了全部自己想要的珠子?如果是,那么告诉她有多少多余的珠子:如果不是,那么告诉她缺了多少珠子. 为方便起见,我们用[0-9].[a-z].[A-Z]范围内的字符来表示颜色

Python 基础练习 PAT水题(一)

#学习笔记 #用以练习Python基础 # #原题链接 https://www.patest.cn/contests/pat-b-practise/1046 1046. 划拳(15) 划拳是古老中国酒文化的一个有趣的组成部分.酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字.如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,输家罚一杯酒.两人同赢或两人同输则继续下一轮,直到唯一的赢家出现. 下面给出甲.乙两人的划拳记录,请你统计他们最后分别喝了多少杯酒. 输入格式: 输

Python 基础练习 PAT水题(四)

#学习笔记 #用以练习python基础 # 原题链接:https://www.patest.cn/contests/pat-b-practise/1050 1050. 螺旋矩阵(25) 本题要求将给定的N个正整数按非递增的顺序,填入"螺旋矩阵".所谓"螺旋矩阵",是指从左上角第1个格子开始,按顺时针螺旋方向填充.要求矩阵的规模为m行n列,满足条件:m*n等于N:m>=n:且m-n取所有可能值中的最小值. 输入格式: 输入在第1行中给出一个正整数N,第2行给出N

简单的dp hdu 数塔(水题)

数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 21314    Accepted Submission(s): 12808 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少

POJ百道水题列表

以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight Moves1101 Gamblers1204 Additive equations 1221 Risk1230 Legendary Pokemon1249 Pushing Boxes 1364 Machine Schedule1368 BOAT1406 Jungle Roads1411 Annive

TYVJ 公路乘车 完全背包(水题)

描述 Description 一个特别的单行街道在每公里处有一个汽车站.顾客根据他们乘坐汽车的公里使来付费.例如样例的第一行就是一个费用的单子. 没有一辆车子行驶超过10公里,一个顾客打算行驶n公里(1<=n<=100),它可以通过无限次的换车来完成旅程.最后要求费用最少. 输入格式 InputFormat 第一行十个整数分别表示行走1到10公里的费用(<=500).注意这些数并无实际的经济意义,即行驶10公里费用可能比行驶一公里少.第二行一个整数n表示,旅客的总路程数. 输出格式 Ou