Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
帮忙看看错哪了,为什么WA?#include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <queue> #define GSIZE 52 #define NSIZE 105 using namespace std; struct _node { int y, x; }; int n, x, y, ncount, map[NSIZE][NSIZE]; char graph[GSIZE][GSIZE]; struct _node node[NSIZE]; bool vst[GSIZE][GSIZE]; int pos(struct _node mynode) //返回某字母的编号 { int i; for(i = 0; i < ncount; i++) if(node[i].y == mynode.y && node[i].x == mynode.x) return i; return -1; } bool isOK(int a, int b) { if(a >= 0 && a < y && b >= 0 && b < x && graph[a][b] != '#' && !vst[a][b]) return true; return false; } void bfs(int s) { queue<struct _node> q; int floor = 0, cnt = 0; //floor宽度优先搜索数的层次,cnt记录已访问字母个数 struct _node empty; //不可能存在的坐标,仅作为队列中的分层标记 empty.y = empty.x = -1; memset(vst, 0, sizeof(vst)); q.push(node[s]); vst[node[s].y][node[0].x] = true; q.push(empty); while(!q.empty()) { struct _node tmp = q.front(); q.pop(); if(tmp.y == -1) //队首是分层标记 { if(q.empty()) return; else { floor++; //层次增长 q.push(empty); //分隔下一层的元素 continue; } } if(graph[tmp.y][tmp.x] == 'A' || graph[tmp.y][tmp.x] == 'S') { map[s][pos(tmp)] = floor; if(++cnt == ncount) //s到各个字母的路长都已找到 return; } int i, dirc[4][2] = {{-1,0}, {0, 1}, {1, 0}, {0, -1}}; for(i = 0; i < 4; i++) if(isOK(tmp.y + dirc[i][0], tmp.x + dirc[i][1])) { struct _node tt; tt.y = tmp.y + dirc[i][0]; tt.x = tmp.x + dirc[i][1]; q.push(tt); vst[tt.y][tt.x] = true; } } return; } int prim(int s) { bool inq[NSIZE]; int dist[NSIZE], count = 0, ret = 0; int i,j; for(i = 0; i < ncount; i++) { inq[i] = false; dist[i] = 0x7fffffff; } dist[s] = 0; while(count < ncount) { int min = 0x7fffffff; for(i = 0; i < ncount; i++) if(!inq[i] && min > dist[i]) { min = dist[i]; j = i; } inq[j] = true; count++; ret += dist[j]; for(i = 0; i < ncount; i++) if(!inq[i] && dist[i] > map[j][i]) dist[i] = map[j][i]; } return ret; } int main() { scanf("%d", &n); while(n--) { scanf("%d%d", &x, &y); int i, j; ncount = 0; //字母个数 char str[100]; gets(str); for(i = 0; i < y; i++) { gets(str); for(j = 0; j < x; j++) { graph[i][j] = str[j]; if(graph[i][j] == 'S') { node[0].y = i; //S结点编0号 node[0].x = j; } if(graph[i][j] == 'A') { ncount++; node[ncount].y = i; node[ncount].x = j; } } } ncount++; for(i = 0; i < ncount; i++) bfs(i); //产生各个字母间最短路长,记录在map中 printf("%d\n", prim(0)); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator