UVALive 4025 Color Squares(BFS)

题目链接:UVALive 4025 Color Squares

按题意要求涂色,求达到w分的最少步数。

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

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <queue>
 5 #define CLR(a, b) memset((a),(b),sizeof((a)))
 6 using namespace std;
 7 const int inf = 0x3f3f3f3f;
 8 int dp[10][10][10][10];
 9 bool vis[5][5][5][5][5][5][5][5][5];//整个棋盘
10 int dx[] = {1,0,-1,0};
11 int dy[] = {0,1,0,-1};
12 struct node {
13     int w;
14     int c[5], g[3][3];
15     node(int _w = 0):w(_w){CLR(c, 0); CLR(g, 0);}
16 }t,p;
17 bool jud(node p) {
18     if(!vis[p.g[0][0]][p.g[0][1]][p.g[0][2]][p.g[1][0]][p.g[1][1]][p.g[1][2]][p.g[2][0]][p.g[2][1]][p.g[2][2]])
19         return true, vis[p.g[0][0]][p.g[0][1]][p.g[0][2]][p.g[1][0]][p.g[1][1]][p.g[1][2]][p.g[2][0]][p.g[2][1]][p.g[2][2]] = 1;
20     return false;
21 }
22 void bfs() {
23     int i, j, k, o, x, y;
24     queue<node> q;
25     q.push(node(0));
26     vis[0][0][0][0][0][0][0][0][0] = 1;
27     while(!q.empty()) {
28         t = q.front(); q.pop();
29         dp[t.c[1]][t.c[2]][t.c[3]][t.c[4]]=min(t.w,dp[t.c[1]][t.c[2]][t.c[3]][t.c[4]]);
30         for(i = 0; i < 3; ++i) {
31             for(j = 0; j < 3; ++j) {
32                 int b=0,r=0,g=0;
33                 for(k = 0; k < 4; ++k) {
34                     x = i + dx[k];
35                     y = j + dy[k];
36                     if(x >=0 && y >= 0 && x < 3 && y < 3) {
37                         if(t.g[x][y]==1) b++;
38                         else if(t.g[x][y]==2) r++;
39                         else if(t.g[x][y]==3) g++;
40                     }
41                 }
42                 int cc = t.g[i][j];
43                 p.w = t.w + 1;
44                 if(cc != 1) {//蓝
45                     for(k = 0; k < 5; ++k) p.c[k] = t.c[k];
46                     for(k = 0; k < 3; ++k)for(o = 0; o < 3; ++o) p.g[k][o] = t.g[k][o];
47                     p.c[cc] = t.c[cc] - 1;
48                     p.c[1] = t.c[1] + 1;
49                     p.g[i][j] = 1;
50                     if(jud(p)) q.push(p);
51                 }
52                 if(cc != 2 && b) {//红
53                     for(k = 0; k < 5; ++k) p.c[k] = t.c[k];
54                     for(k = 0; k < 3; ++k)for(o = 0; o < 3; ++o) p.g[k][o] = t.g[k][o];
55                     p.c[cc] = t.c[cc] - 1;
56                     p.c[2] = t.c[2] + 1;
57                     p.g[i][j] = 2;
58                     if(jud(p)) q.push(p);
59                 }
60                 if(cc != 3 && b && r) {//绿
61                     for(k = 0; k < 5; ++k) p.c[k] = t.c[k];
62                     for(k = 0; k < 3; ++k)for(o = 0; o < 3; ++o) p.g[k][o] = t.g[k][o];
63                     p.c[cc] = t.c[cc] - 1;
64                     p.c[3] = t.c[3] + 1;
65                     p.g[i][j] = 3;
66                     if(jud(p)) q.push(p);
67                 }
68                 if(cc != 4 && b && r && g) {//黄
69                     for(k = 0; k < 5; ++k) p.c[k] = t.c[k];
70                     for(k = 0; k < 3; ++k)for(o = 0; o < 3; ++o) p.g[k][o] = t.g[k][o];
71                     p.c[cc] = t.c[cc] - 1;
72                     p.c[4] = t.c[4] + 1;
73                     p.g[i][j] = 4;
74                     if(jud(p)) q.push(p);
75                 }
76             }
77         }
78     }
79 }
80 int main() {
81     CLR(dp, inf);CLR(vis,false);bfs();
82     int ka = 1, b, r, g, y, w, i, j, k, o;
83     while(~scanf("%d", &b), b) {
84         scanf("%d%d%d%d", &r, &g, &y, &w);
85         printf("Case %d: ", ka++);
86         int ans = inf;
87         for(i=0;i<10;++i)for(j=0;j<10;++j)for(k=0;k<10;++k)for(o=0;o<10;++o)
88         if(b*i+r*j+g*k+y*o >= w) ans = min(ans, dp[i][j][k][o]);
89         if(ans < inf) printf("%d\n" ,ans);
90         else puts("Impossible");
91     }
92     return 0;
93 }

时间: 2024-10-17 23:55:17

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

UVALive 5066 Fire Drill BFS+背包

H - Fire Drill Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVALive 5066 Description Joko is taking part in a fire drill which is held by the Jakarta Fire Department to recruit new firemen. The drill i

UVALive 5066 Fire Drill --BFS+DP

题意:有一个三维的地图,有n个人被困住,现在消防队员只能从1楼的一个入口进入,营救被困者,每一个被困者有一个价值,当消防队员找到一个被困者之后,他可以营救或者见死不救,如果救的话,他必须马上将其背到入口处,不得停下,不得同时救多个人,而且回去的时间一步要做两步走,即时间增加一倍.求在给定时间S内,能救到的人的最大价值总和. 解法:bfs一遍记录每个点离起点的最短距离,那么救这个人的花费就是3*dis,然后已经知道救这个人的价值,那么最后求一个01背包即可. 要注意一个人都救不到的地方,我开始将d

uvalive 6888 Ricochet Robots bfs

题目链接 给一个n*m的图, 图上有n个标号, n<=4, 然后有墙, 还有一个终点x. 每一步, 只能走某一个标号, 可以向四个方向走, 然后必须要碰到墙或者图的边界或者另一个标号才能停下来. 问你在t步之内能否使第一个标号到达终点. 因为有一个上限t. 所以直接bfs就可以, 感觉思路不是很难, 但是写代码+调试花了超级久...不过总算1A, 不然就懵逼了. #include <bits/stdc++.h> using namespace std; #define pb(x) pus

UVA1625 / UVALive 5841 Color Length DP

简单DP,dp[i][j]表示从第一个序列里取出i个和从第j个序列里取出j个的组合的最小值,可以从两个方向转移过来,每次转移加上已经出现过的且还没有出现完的字母的个数. O(n?m)的复杂度. 1625 Color Length Cars painted in different colors are moving in a row on the road as shown in Figure 1. The color of each car is represented by a single

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

题目:传送门. 题意:t组数据,每组给定n,m,k.有n个格子,m种颜色,要求把每个格子涂上颜色且正好适用k种颜色且相邻的格子颜色不同,求一共有多少种方案,结果对1e9+7取余. 题解: 首先可以将m 与后面的讨论分离.从m 种颜色中取出k 种颜色涂色,取色部分有C(m, k) 种情况: 然后通过尝试可以发现,第一个有k种选择,第二个因不能与第一个相同,只有(k-1) 种选择,第三个也只需与第二个不同,也有(k-1) 种选择.总的情况数为k ×(k-1)^(n-1).但这仅保证了相邻颜色不同,总

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

题目传送门 题意:n盆花涂色,相邻不能涂相同的颜色,从m中颜色选取k种颜色涂,保证正好有k种颜色 分析:从m中颜色选取k种就是C (m, k),然后第一个有k种选择,之后的都有k-1种选择,这样是不超过k种颜色的方案,那么减去少了Ai颜色的方案数,用容斥原理,最后答案是C(m,k) × ( k × (k-1)^(n-1) + ∑((-1)^p × C(k, p) × p × (p-1)^(n-1) ) (2 <= p <= k-1): #include <cstdio> #incl

bfs:求最短路径的长度

*/--> pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;}

组合数取模(转载)

本文转自:http://blog.csdn.net/skywalkert/article/details/52553048 0. 写在前面 在程序设计中,可能会碰到多种类型的计数问题,其中不少涉及到组合数的计算,所以笔者写下这么一篇文章,期望能解决一些常规的组合数求模问题.以下部分内容改编自AekdyCoin的<组合数求模>,而且为了感谢他对(懵懂的)笔者的启发,这篇文章的标题与其文章相同.另外,感谢Picks将多项式运算的技巧在中国进行推广,感谢51nod提供了许多有趣的数论题目,感谢fot

529. Minesweeper

You are given a 2D char matrix representing the game board. 'M' represents an unrevealed mine, 'E' represents an unrevealed empty square, 'B' represents a revealed blank square that has no adjacent (above, below, left, right, and all 4 diagonals) min