标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 6739 Accepted Submission(s): 1564
#include <iostream> #include <algorithm> #include <stdio.h> #include <string.h> #include <queue> using namespace std; const int INF = 999999999; int n,m,limit,num; int dis[60][60]; ///记录两点之间的距离 int jw[60]; struct Node{ int x,y,step,geshu; }s; char graph[60][60]; bool vis[60][60]; int dir[][2]={{1,0},{-1,0},{0,1},{0,-1}}; bool check(int x,int y){ if(x<1||x>n||y<1||y>m||vis[x][y]||graph[x][y]==‘*‘) return false; return true; } void bfs(Node s,int k){ queue<Node> q; vis[s.x][s.y] = true; s.geshu = 1; q.push(s); while(!q.empty()){ Node now = q.front(); q.pop(); if(now.geshu==num+2) return; for(int i=0;i<4;i++){ Node next; next.x = now.x+dir[i][0]; next.y = now.y+dir[i][1]; if(!check(next.x,next.y)) continue; char c = graph[next.x][next.y]; next.step = now.step+1; next.geshu = now.geshu+1; if(c==‘.‘) next.geshu-=1; if(c==‘@‘){ dis[k][0] = next.step; } else if(c>=‘A‘&&c<=‘J‘) { dis[k][c-‘A‘+1] = next.step; }else if(c==‘<‘){ dis[k][num+1] = next.step; } vis[next.x][next.y] = true; q.push(next); } } } bool vis1[60]; int MAX = 0,sum; void dfs(int u,int step,int ans){ if(step>limit || MAX == sum) return ; ///必须要加剪枝 if(u==num+1){ MAX = max(MAX,ans); return; } for(int i=0;i<=num+1;i++){ if(!vis1[i]){ vis1[i] = true; dfs(i,step+dis[u][i],ans+jw[i]); vis1[i] = false; } } } int main(){ int tcase; scanf("%d",&tcase); int kk = 1; while(tcase--){ for(int i=0;i<30;i++){ for(int j=0;j<30;j++){ dis[i][j] = (i==j)?0:INF; } } scanf("%d%d%d%d",&m,&n,&limit,&num); sum = 0; for(int i=1;i<=num;i++){ scanf("%d",&jw[i]); sum+=jw[i]; } jw[num+1] = jw[0] = 0; for(int i=1;i<=n;i++){ scanf("%s",graph[i]+1); } for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(graph[i][j]==‘@‘) { memset(vis,false,sizeof(vis)); s.x = i,s.y = j,s.step=0; bfs(s,0); } if(graph[i][j]==‘<‘){ memset(vis,false,sizeof(vis)); s.x = i,s.y = j,s.step=0; bfs(s,num+1); } if(graph[i][j]>=‘A‘&&graph[i][j]<=‘J‘){ memset(vis,false,sizeof(vis)); s.x = i,s.y = j,s.step=0; bfs(s,graph[i][j]-‘A‘+1); } } } printf("Case %d:\n",kk++); if(dis[0][num+1]>limit){ printf("Impossible\n"); if(tcase) printf("\n"); continue; } memset(vis1,false,sizeof(vis1)); MAX = 0; vis1[0] = true; dfs(0,0,0); printf("The best score is %d.\n",MAX); if(tcase) printf("\n"); } }
标签:
原文地址:http://www.cnblogs.com/liyinggang/p/5742882.html