题目链接:UVALive 4025 Color Squares

按题意要求放带有颜色的块,求达到w分的最少步数。

//yy:哇,看别人存下整个棋盘的状态来做,我什么都不想说了,不知道下午自己写了些什么东西,训练结束补的、、

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define CLR(a, b) memset((a),(b),sizeof((a)))
using namespace std;
const int inf = 0x3f3f3f3f;
int dp[][][][];
bool vis[][][][][][][][][];//整个棋盘
int dx[] = {,,-,};
int dy[] = {,,,-};
struct node {
int w;
int c[], g[][];
node(int _w = ):w(_w){CLR(c, ); CLR(g, );}
}t,p;
bool jud(node p) {
if(!vis[p.g[][]][p.g[][]][p.g[][]][p.g[][]][p.g[][]][p.g[][]][p.g[][]][p.g[][]][p.g[][]])
return true, vis[p.g[][]][p.g[][]][p.g[][]][p.g[][]][p.g[][]][p.g[][]][p.g[][]][p.g[][]][p.g[][]] = ;
return false;
}
void bfs() {
int i, j, k, o, x, y;
queue<node> q;
q.push(node());
vis[][][][][][][][][] = ;
while(!q.empty()) {
t = q.front(); q.pop();
dp[t.c[]][t.c[]][t.c[]][t.c[]]=min(t.w,dp[t.c[]][t.c[]][t.c[]][t.c[]]);
for(i = ; i < ; ++i) {
for(j = ; j < ; ++j) {
int b=,r=,g=;
for(k = ; k < ; ++k) {
x = i + dx[k];
y = j + dy[k];
if(x >= && y >= && x < && y < ) {
if(t.g[x][y]==) b++;
else if(t.g[x][y]==) r++;
else if(t.g[x][y]==) g++;
}
}
int cc = t.g[i][j];
p.w = t.w + ;
if(cc != ) {//蓝
for(k = ; k < ; ++k) p.c[k] = t.c[k];
for(k = ; k < ; ++k)for(o = ; o < ; ++o) p.g[k][o] = t.g[k][o];
p.c[cc] = t.c[cc] - ;
p.c[] = t.c[] + ;
p.g[i][j] = ;
if(jud(p)) q.push(p);
}
if(cc != && b) {//红
for(k = ; k < ; ++k) p.c[k] = t.c[k];
for(k = ; k < ; ++k)for(o = ; o < ; ++o) p.g[k][o] = t.g[k][o];
p.c[cc] = t.c[cc] - ;
p.c[] = t.c[] + ;
p.g[i][j] = ;
if(jud(p)) q.push(p);
}
if(cc != && b && r) {//绿
for(k = ; k < ; ++k) p.c[k] = t.c[k];
for(k = ; k < ; ++k)for(o = ; o < ; ++o) p.g[k][o] = t.g[k][o];
p.c[cc] = t.c[cc] - ;
p.c[] = t.c[] + ;
p.g[i][j] = ;
if(jud(p)) q.push(p);
}
if(cc != && b && r && g) {//黄
for(k = ; k < ; ++k) p.c[k] = t.c[k];
for(k = ; k < ; ++k)for(o = ; o < ; ++o) p.g[k][o] = t.g[k][o];
p.c[cc] = t.c[cc] - ;
p.c[] = t.c[] + ;
p.g[i][j] = ;
if(jud(p)) q.push(p);
}
}
}
}
}
int main() {
CLR(dp, inf);CLR(vis,false);bfs();
int ka = , b, r, g, y, w, i, j, k, o;
while(~scanf("%d", &b), b) {
scanf("%d%d%d%d", &r, &g, &y, &w);
printf("Case %d: ", ka++);
int ans = inf;
for(i=;i<;++i)for(j=;j<;++j)for(k=;k<;++k)for(o=;o<;++o)
if(b*i+r*j+g*k+y*o >= w) ans = min(ans, dp[i][j][k][o]);
if(ans < inf) printf("%d\n" ,ans);
else puts("Impossible");
}
return ;
}

UVALive 4025 Color Squares(BFS)的更多相关文章

  1. UVALive 5066 Fire Drill BFS+背包

    H - Fire Drill Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Sta ...

  2. UVALive 5066 Fire Drill --BFS+DP

    题意:有一个三维的地图,有n个人被困住,现在消防队员只能从1楼的一个入口进入,营救被困者,每一个被困者有一个价值,当消防队员找到一个被困者之后,他可以营救或者见死不救,如果救的话,他必须马上将其背到入 ...

  3. uvalive 6888 Ricochet Robots bfs

    题目链接 给一个n*m的图, 图上有n个标号, n<=4, 然后有墙, 还有一个终点x. 每一步, 只能走某一个标号, 可以向四个方向走, 然后必须要碰到墙或者图的边界或者另一个标号才能停下来. ...

  4. 洛谷 - P2730 - 魔板 Magic Squares - bfs

    写状态转移弄了很久,老了,不记得自己的数组是怎么标号的了. #include <bits/stdc++.h> using namespace std; #define ll long lo ...

  5. UVALive 7040 Color (容斥原理+逆元+组合数+费马小定理+快速幂)

    题目:传送门. 题意:t组数据,每组给定n,m,k.有n个格子,m种颜色,要求把每个格子涂上颜色且正好适用k种颜色且相邻的格子颜色不同,求一共有多少种方案,结果对1e9+7取余. 题解: 首先可以将m ...

  6. UVALive 7040 Color

    题目链接:LA-7040 题意为用m种颜色给n个格子染色.问正好使用k种颜色的方案有多少. 首先很容易想到的是\( k * (k-1)^{n-1}\),这个算出来的是使用小于等于k种颜色给n个方格染色 ...

  7. 组合数+容斥原理 UVALive 7040 Color(14西安F)

    题目传送门 题意:n盆花涂色,相邻不能涂相同的颜色,从m中颜色选取k种颜色涂,保证正好有k种颜色 分析:从m中颜色选取k种就是C (m, k),然后第一个有k种选择,之后的都有k-1种选择,这样是不超 ...

  8. UVA1599-Ideal Path(BFS进阶)

    Problem UVA1599-Ideal Path Time Limit: 3000 mSec Problem Description New labyrinth attraction is ope ...

  9. UVA-1599 Ideal Path(双向BFS)

    题目: 给一个n个点m条边(2≤m≤100000, 1≤m≤200000)的无向图,每条边上都涂有一种颜色(用1到1000000000表示).求从结点1到结点n的一条路径, 使得经过的边数尽量少,在此 ...

随机推荐

  1. ASP.NET Core中使用xUnit进行单元测试

    单元测试的功能自从MVC的第一个版本诞生的时候,就是作为一个重要的卖点来介绍的,通常在拿MVC与webform比较的时候,单元测试就是必杀底牌,把webform碾压得一无是处. 单元测试的重要性不用多 ...

  2. git 检查是否有commit到本地但还没push的代码

    使用 git status 命令可以得到以下结果 $ git status On branch dev_getTicketCnt Your branch is ahead of 'origin/mas ...

  3. .netCore2.0 依赖注入

    依赖注入(ID)是一种实现对象及其合作者或者依赖想之间松散耦合的技术对于传统的方法来说,获取类的方法通常用new如下 public class DIController : Controller { ...

  4. moment常用操作

    1.返回当前日期截止时的时间戳: post.createtime = moment().unix(); let stime = moment(moment.unix(moment().unix()). ...

  5. jsp servlet基础复习 Part2--GET,Post请求

    最近进行servlet和jsp方面的梳理复习时,发现以前忽略了一个非常重要的知识点:get和post的请求(如果你觉得两者仅仅是提交数据量的大小以及方式不同就大错特错了)的正真区别,下面进行简答的整理 ...

  6. 基数排序——Java实现

    一.基数排序思想 相比其它排序,主要是利用比较和交换,而基数排序则是利用分配和收集两种基本操作.基数 排序是一种按记录关键字的各位值逐步进行排序的方法.此种排序一般适用于记录的关键字为整数类型的情况. ...

  7. Filter内容

    1.利用Filter来过滤的时候大都是Http请求和Http响应,在doFilter()方法中,参数类是ServletRequest和ServletResponse  ,使用的时候一般需要强制转换为H ...

  8. git管理之源切换

    Git remote 修改源 git commit -m "Change repo." # 先把所有为保存的修改打包为一个commit git remote remove orig ...

  9. Linux符设备驱动编程

    加入内核源码树外 ① 建立两个文件scull.c,scull.h,以及Makefile文件 Makefile文件 ② 用make进行编译,生成scull.ko驱动程序模块 ③ 把scull.ko模块加 ...

  10. Codeforces Round #415 (Div. 2) B. Summer sell-off

    B. Summer sell-off time limit per test   1 second memory limit per test   256 megabytes   Summer hol ...