zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    分布式文件系统技术选型
    .net core 与nginx笔记
    分布式场景
    c printf函数
    c 编程范式
    VS2019 卡顿,甚至卡死
    SQL Server 跨服务器查询
    递归 0到100求和
    moment js 制作倒计时 比较简单
    关于地狱回调的理解
  • 原文地址:https://www.cnblogs.com/GraceSkyer/p/7252033.html
Copyright © 2011-2022 走看看