题目链接: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 }