C - Catch That Cow POJ - 3278

我心态崩了,现在来回顾很早之前写的简单搜索,好难啊,我怎么写不出来。

我开始把这个写成了dfs,还写搓了。。。

慢慢来吧。

这个题目很明显是一个很简单的搜索题,但是如果用dfs的话很容易出现问题,而且复杂度不低。

所以选择用bfs。

这个知道用bfs就应该比较简单了。

就是有三种走的方式,因为k最大为100000  所以我们要限制一下,不然会超时。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#include <iostream>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = 5e5 + ;
int n, k;
bool vis[maxn];
int d[maxn];
int t[] = { ,- }; void bfs(int x)
{
queue<int>que;
que.push(x);
vis[x] = ;
d[x] = ; while (!que.empty()) {
int u = que.front(); que.pop();
if (u > ) continue;
if (u < ) continue;
if(u==k)
{
printf("%d\n", d[k]);
return;
}
for(int i=;i<=;i++)
{
int tx;
if (i == ) tx = u * ;
else tx = u + t[i]; if (vis[tx]) continue;
if (u < || u > ) continue; vis[tx] = ;
d[tx] = d[u] + ;
que.push(tx);
}
}
} int main()
{
scanf("%d%d", &n, &k);
bfs(n);
return ;
}

C

D - Fliptile

POJ - 3279

看到这个题目,我真的心态崩了,这个题目好难啊,结果居然是简单搜索,我现在怀疑我这一年来干了什么。。。

感觉自己好菜。。。

算了,没办法,还是好好刷题吧。

这个题目真的很难。

因为我们每一个翻转,都会改变左右的色块,所以我们每次从下面的那块来使得上面的那块翻转,如果需要的话。

如果知道这一点了就稍微好做那么一点点了。

所以我们只要枚举第一块是怎么翻转的,这样子可以直接推出下面的是怎么翻转的。

知道这一点了,就很好写了,不过还是不一定可以写出代码,因为不知道怎么处理。

然后就看题解学习一下怎么写吧。

这个题目我有一个地方出现bug了,然后一直没有找到,就是一行有m个数,所以最多有m个1 所以枚举第一行的时候应该是1<<m

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <vector>
#include <algorithm>
#include <iostream>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn = 1e5 + ;
int f[][], mp[][];
const int dx[] = { -,,,, };
const int dy[] = { ,-,,, };
int ans[][];
int n, m; int getnum(int x, int y)//这个是由初始和翻转次数来判断这个面是0还是1
{
int res = mp[x][y];
for (int i = ; i < ; i++) {
int tx = x + dx[i];
int ty = y + dy[i]; if (tx >= && ty >= && tx < n&&ty < m) res += f[tx][ty];
}
return res % ;
} int cal() {
for (int i = ; i < n; i++) {
for (int j = ; j < m; j++) {
if (getnum(i - , j)) {
f[i][j] = ;
}
}
}
for (int i = ; i < m; i++) {
if (getnum(n - , i)) return -;
}
int res = ;
for (int i = ; i < n; i++) {
for (int j = ; j < m; j++) {
res += f[i][j];
}
}
return res;
} void solve() {
int res = -;
for (int i = ; i < ( << m); i++) {
memset(f, , sizeof(f));
for (int j = ; j < m; j++) {
f[][m - j - ] = i >> j & ;
}
int num = cal();
if (num >= && (res < || num < res)) {
res = num;
memcpy(ans, f, sizeof(f));
}
}
if (res == -) printf("IMPOSSIBLE\n");
else {
for (int i = ; i < n; i++) {
for (int j = ; j < m; j++) {
printf("%d%c", ans[i][j], j + == m ? '\n' : ' ');
}
}
}
} int main() {
scanf("%d%d", &n, &m);
for (int i = ; i < n; i++) {
for (int j = ; j < m; j++) {
scanf("%d", &mp[i][j]);
}
}
solve();
return ;
}

D

最新文章

  1. linux vim
  2. aliyun的yum源(国内速度极快)
  3. Android布局文件layout.xml的一些属性值
  4. 1046-第K回文数
  5. VPN column: PPTP(1)--connecting process
  6. RenderPartial: No overload for method &#39;Write&#39; takes 0 arguments
  7. Some Error
  8. poj3270Cow Sorting(置换+贪心)
  9. freemarker中的substring取子串
  10. 二、docker的安装和基本命令
  11. rsync镜像命令
  12. linux下搭建SVN
  13. [zz]LyX 入门教程
  14. ubuntu18.04 出现 Command &#39;ifconfig&#39; not found 问题的解决办法
  15. [Tensorflow] Object Detection API - predict through your exclusive model
  16. 《ABCNN: Attention-Based Convolutional Neural Network for Modeling Sentence Pairs》
  17. CentOS7安装OpenStack(Rocky版)-07.安装horizon服务组件(控制节点dashboard)
  18. Win2008 Server系统安装打印服务器与配置
  19. MyEclipse生成Javadoc帮助文档
  20. 后端日期类属性date 不接受string类型日期,都是没找到解决的方法,所有前端传回的string字符串都一一转化为java定义的类型

热门文章

  1. Linux中使用netstat命令的基本操作,排查端口号的占用情况
  2. JDK安装详细步骤
  3. 移动硬盘临时文件太多怎么办,python黑科技帮你解决
  4. Maven+JSP+Servlet+JDBC+Redis+Mysql实现的黑马旅游网
  5. C#开发BIMFACE系列31 服务端API之模型对比2:获取模型对比状态
  6. PHP 语法字符串函数 strcmp、strlen 使用及实现
  7. python学习笔记(四)---用户输入与while循环
  8. IntelliJ IDEA在mac中完全删除方法
  9. phpcms 用phpexcel导入导出excel
  10. Cent OS 7 搭建MySQL