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
" ,ans);
90         else puts("Impossible");
91     }
92     return 0;
93 }
View Code
原文地址:https://www.cnblogs.com/GraceSkyer/p/7252033.html