洛谷刷题小结
#include <iostream>
using namespace std;
int n, m,ans=0;
char s[105][105];
//深搜
void dfs(int x, int y) {
//将搜索到的水坑看为干地
s[x][y] = '.';
//确定八个方向
int next[8][2] = {
{0,1},
{0,-1},
{1,0},
{-1,0},
{1,1},
{1,-1},
{-1,1},
{-1,-1},
};
//朝八个方向搜索
for (int k = 0; k < 8; k++) {
int tx = x + next[k][0];
int ty = y + next[k][1];
if (tx<1 || tx>n || ty<1 || ty>m) {
continue;
}
if (s[tx][ty]=='W') {
dfs(tx, ty);
}
}
return;
}
int main()
{
cin >> n >> m;
//输入地形
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> s[i][j];
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
//如果是水坑,搜索
if (s[i][j] == 'W') {
dfs(i, j);
//水塘数目加一
ans++;
}
}
}
cout << ans << endl;
}
#include <iostream>
using namespace std;
int m, n;
int a[10];
void print(int x) {
for (int i = 1; i < x; i++) {
cout << a[i] << "+";
}
cout << a[x] << endl;
}
//搜索
void dfs(int x) {
//回溯后跳出
for (int i = a[x - 1]; i <= n; i++) {
//防止输出n
if (i == m) {
continue;
}
a[x] = i;
n -= i;
//排列完毕,输出
if (n == 0) {
print(x);
}
//否则继续搜索
else {
dfs(x + 1);
}
n += i;
}
}
int main()
{
for (int i = 0; i < 10; i++) {
a[i] = 1;
}
cin >> m;
n = m;
dfs(1);
return 0;
}
状压是什么,不寄丢啊,看见是搜索里的,没看标签,我就搜了,也是成功卡九十分死活过不了,也是成功被拿下了......,参考全排列的方法做的,代码有些多余的,不必理会
#include <iostream>
#include <cmath>
using namespace std;
int n;
double ans = 2e9, sum = 0;
struct yyc {
double x;
double y;
}q[20];
int book[20], a[20];
double distance(double x, double y, double a, double b) {
return sqrt(((x - a) * (x - a) + (y - b) * (y - b)));
}
void dfs(double x, double y, int step)
{
int i;
if (sum > ans) {
return;
}
if (step == n + 1) {
ans = min(ans, sum);
/*for (i = 1; i <= n; i++) {
printf(" %d", a[i]);
}
printf("\n");
cout << ans << endl;*/
return;
}
for (i = 1; i <= n; i++) {
if (book[i] == 0) {
book[i] = 1;
a[step] = i;
sum += distance(x, y, q[a[step]].x, q[a[step]].y);
dfs(q[a[step]].x, q[a[step]].y, step + 1);
sum -= distance(x, y, q[a[step]].x, q[a[step]].y);
book[i] = 0;
}
/*if (book[i] == 0) {
a[step] = i;
book[i] = 1;
dfs(0,0,step + 1);
book[i] = 0;
}*/
}
return;
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> q[i].x >> q[i].y;
}
dfs(0, 0, 1);
printf("%.2lf\n", ans);
}
#include <iostream>
using namespace std;
int book[205], s[205][2];
//定义结构体存储数据
struct yyc {
int x;
int s;
}q[40005];
int main()
{
int n, a, b;
cin >> n >> a >> b;
//特例:如果a和b'是同一层,输出0;
if (a == b) {
cout << 0 << endl;
return 0;
}
//输入每层电梯走的楼的层数
for (int i = 1; i <= n; i++) {
int x;
cin >> x;
s[i][0] = x;
s[i][1] = -x;
}
int head = 1, tail = 1;
q[tail++].x = a;
q[head].s = 0;
//检测能不能到达
int flog = 0;
long long step = 0;
//广搜
while (head < tail) {
for (int k = 0; k < 2; k++) {
int tx = q[head].x + s[q[head].x][k];
//cout << tx << endl;
if (tx<1 || tx>n) {
continue;
}
if (book[tx] == 0){
book[tx] = 1;
q[tail].x = tx;
q[tail].s = q[head].s + 1;
tail++;
}
if (tx == b) {
flog = 1;
break;
}
}
if (flog == 1) {
break;
}
head++;
}
//flog为零无法到达输出-1
if (flog == 0) {
cout << -1 << endl;
return 0;
}
//反之,输出次数
cout << q[tail-1].s << endl;
return 0;
}
#include <iostream>
using namespace std;
int a[5], b[25][5];
int ans=0,minx,l,r;
void dfs(int x, int y) {
if (x > a[y]) {
minx = min(minx, max(l, r));
return;
}
l += b[x][y];
dfs(x + 1, y);
l -= b[x][y];
r += b[x][y];
dfs(x + 1, y);
r -= b[x][y];//毫无技巧的搜索回溯
}
int main()
{
cin >> a[1] >> a[2] >> a[3] >> a[4];
for (int i = 1; i <= 4; i++) {//减少码量
l = 0,r=0;
minx = 2e9;
for (int j = 1; j <= a[i]; j++)
cin >> b[j][i];
dfs(1, i);
ans += minx;
}
cout << ans << endl;
}
#include <iostream>
using namespace std;
int n, m,c;
int a[1000005];
//二分查找
int find(int x) {
int l = 1, r = n;
//当l和r没相遇时
while (l < r) {
//中间值
int mid = (l + r) / 2;
//要找的数小于等于中间值,右边界为中间值
if (x <= a[mid]) {
r = mid;
}
//否则左边界为中间值加一
else {
l = mid + 1;
}
}
//找到输出l。否则输出-1;
if (a[l] == x)
return l;
return -1;
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
for (int i = 1; i <= m; i++) {
scanf("%d", &c);
int ans = find(c);
printf("%d ", ans);
}
return 0;
}