快速切题 poj3026

感受到出题人深深的~恶意

这提醒人们以后。。。数字后面要用gets~不要getchar

此外。。不要相信那个100?

Borg Maze

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 8524   Accepted: 2872

Description

The Borg is an immensely powerful race of enhanced humanoids from the delta quadrant of the galaxy. The Borg collective is the term used to describe the group consciousness of the Borg civilization. Each Borg individual is linked to the collective by a sophisticated subspace network that insures each member is given constant supervision and guidance.

Your task is to help the Borg (yes, really) by developing a program which helps the Borg to estimate the minimal cost of scanning a maze for the assimilation of aliens hiding in the maze, by moving in north, west, east, and south steps. The tricky thing is that the beginning of the search is conducted by a large group of over 100 individuals. Whenever an alien is assimilated, or at the beginning of the search, the group may split in two or more groups (but their consciousness is still collective.). The cost of searching a maze is definied as the total distance covered by all the groups involved in the search together. That is, if the original group walks five steps, then splits into two groups each walking three steps, the total distance is 11=5+3+3.

Input

On the first line of input there is one integer, N <= 50, giving the number of test cases in the input. Each test case starts with a line containg two integers x, y such that 1 <= x,y <= 50. After this, y lines follow, each which x characters. For each character, a space `` ‘‘ stands for an open space, a hash mark ``#‘‘ stands for an obstructing wall, the capital letter ``A‘‘ stand for an alien, and the capital letter ``S‘‘ stands for the start of the search. The perimeter of the maze is always closed, i.e., there is no way to get out from the coordinate of the ``S‘‘. At most 100 aliens are present in the maze, and everyone is reachable.

Output

For every test case, output one line containing the minimal cost of a succesful search of the maze leaving no aliens alive.

Sample Input

2
6 5
#####
#A#A##
# # A#
#S  ##
#####
7 7
#####
#AAA###
#    A#
# S ###
#     #
#AAA###
#####

Sample Output

8
11思路: bfs遍历得两点距(这道题数据不大),prim即可应用时:30min实际用时:2h
//M: 5056K T:47MS
#include<cstdio>
#include <cstring>
#include <queue>
#include <assert.h>
using namespace std;
char maz[202][202];//迷宫
bool vis[202][202];//用来存储bfs过程中是否遍历以节约时间
int d[201][202][202];//d[aliennum][y][x]从第alinum到坐标y,x的最小步数
int alien[201][2];//记录alien坐标,地球人也是alien之一
int numa;//alien数目
int x,y;//迷宫总长
int sx,sy;//人类起点
int e[202][202];//建图
typedef pair<int,int> P;
queue<P>  que;//用来存储bfs结果
const int dx[4]={0,0,-1,1};
const int dy[4]={-1,1,0,0};
bool used[101];//用来存储prim过程
void bfs(){
    sx=sy=-1;
    numa=0;
    memset(vis,0,sizeof(vis));
    for(int i=0;i<y;i++){//为了把s点作为起点所以特意寻找,其实不用
        for(int j=0;j<x;j++){
            if(maz[i][j]==‘S‘){
                sx=j;
                sy=i;
                break;
            }
        }
    }
    assert(sx!=-1&&sy!=-1);//判断有没有找到sxsy,这次用这个发现scanf读迷宫不可
    vis[sy][sx]=true;//起始点当然已经走过了
    d[0][sy][sx]=0;
    alien[numa][0]=sy;
    alien[numa++][1]=sx;
    que.push(P(sy,sx));//分层bfs
    while(!que.empty()){
        P p=que.front();
        que.pop();
        for(int i=0;i<4;i++){
            int ny=p.first+dy[i];
            int nx=p.second+dx[i];
            if(nx>=0&&nx<x&&ny>=0&&ny<y&&!vis[ny][nx]&&maz[ny][nx]!=‘#‘){
                d[0][ny][nx]=d[0][p.first][p.second]+1;
                vis[ny][nx]=true;
                que.push(P(ny,nx));
                if(maz[ny][nx]==‘A‘){//把所有找到的外星人编个号
                    alien[numa][0]=ny;
                    alien[numa++][1]=nx;
                }
            }
        }
    }
    for(int ai=1;ai<numa;ai++){//以各个外星人作为起点开始
        memset(vis,0,sizeof(vis));
        int ay=alien[ai][0],ax=alien[ai][1];//外星人地址
        d[ai][ay][ax]=0;
        que.push(P(ay,ax));
        vis[ay][ax]=true;//起点当然已经遍历
        while(!que.empty()){
            P p=que.front();
            que.pop();
            for(int i=0;i<4;i++){
                int ny=p.first+dy[i];
                int nx=p.second+dx[i];
                if(nx>=0&&nx<x&&ny>=0&&ny<y&&!vis[ny][nx]&&maz[ny][nx]!=‘#‘){
                    d[ai][ny][nx]=d[ai][p.first][p.second]+1;
                    vis[ny][nx]=true;
                    que.push(P(ny,nx));//从这一点出发的状况加入队列
                }
            }
        }
    }
    for(int i=0;i<numa;i++){//取边建图
        for(int j=0;j<numa;j++){
            int ay1=alien[j][0],ax1=alien[j][1];//所有的其他外星人坐标,自己对自己肯定是0
            e[i][j]=d[i][ay1][ax1];
        }
    }
}
priority_queue <P,vector<P>, greater <P> > pque;
int prim(){
    memset(used,0,sizeof(used));//多组case所以memset
    used[0]=true;//alien[0]是人类,不过也无所谓,总之这个点走过了
    int unum=1;//这时候已经加入了一个点,就是人类起点,用来存储当前树有多少已加入节点
    for(int i=1;i<numa;i++){
        pque.push(P(e[0][i],i));//把到当前树的所有边都加入以找到最小边,这条边所连的那个点进树没有更短的路径了,因为是树所以这步贪心只会优化结果不会丢失结果
    }
    int ans=0;
    while(unum<numa){
        int t=pque.top().second;
        int td=pque.top().first;
        pque.pop();
        if(used[t])continue;
        ans+=td;
        used[t]=true;
        unum++;
        for(int i=0;i<numa;i++){
            if(!used[i]){
                pque.push(P(e[t][i],i));//按边排序
            }
        }
    }
    while(!pque.empty())pque.pop();//多组case所以pop,也许直接建立在过程里更好吧
    return ans;
}
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&x,&y);
        gets(maz[0]);//不想再建一个专门接收空格的字符串所以用了maz[0]
        for(int i=0;i<y;i++){
            gets(maz[i]);
        }
        bfs();//取点建图
        int ans=prim();
        printf("%d\n",ans);
    }
}

  

快速切题 poj3026

时间: 2024-08-06 21:18:47

快速切题 poj3026的相关文章

快速切题 cf118A

这教导人们一定要看题,要看题,元音包含了‘y’,完毕,要看题啊 #include <cstring> #include <cstdio> #include <cctype> using namespace std; char buff[1001]; int main(){ scanf("%s",buff); for(int i=0;buff[i];i++){ buff[i]=tolower(buff[i]); if(buff[i]=='a'||buf

快速切题 poj2488 A Knight&#39;s Journey

A Knight's Journey Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 31195   Accepted: 10668 Description Background The knight is getting bored of seeing the same black and white squares again and again and has decided to make a journey ar

快速切题 acdream手速赛(6)A-C

Sudoku Checker Time Limit: 2000/1000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others) SubmitStatisticNext Problem Problem Description Sudoku is a popular single player game. The objective is to fill a 9x9 matrix with digits so that each colu

快速切题 poj1068

Parencodings Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19716   Accepted: 11910 Description Let S = s1 s2...s2n be a well-formed string of parentheses. S can be encoded in two different ways: q By an integer sequence P = p1 p2...pn

快速切题 sgu 112. a^b-b^a 大数 次方 难度:0 非java:1

112. a^b-b^a time limit per test: 0.25 sec. memory limit per test: 4096 KB You are given natural numbers a and b. Find a^b-b^a. Input Input contains numbers a and b (1≤a,b≤100). Output Write answer to output. Sample Input 2 3Sample Output -1 import j

快速切题 poj 2993 Emag eht htiw Em Pleh 模拟

Emag eht htiw Em Pleh Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2806   Accepted: 1865 Description This problem is a reverse case of the problem 2996. You are given the output of the problem H and your task is to find the correspond

快速切题 poj 2996 Help Me with the Game 模拟暴力

Help Me with the Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3510   Accepted: 2251 Description Your task is to read a picture of a chessboard position and print it in the chess notation. Input The input consists of an ASCII-art

快速切题 poj 2485 Highways prim算法+堆 不完全优化

Highways Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 23033   Accepted: 10612 Description The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no public highways. So the traffic is difficult in Flatopia. The Fl

快速切题 hdu2416 Treasure of the Chimp Island 搜索 解题报告

Treasure of the Chimp Island Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 313    Accepted Submission(s): 151 Problem Description Bob Bennett, the young adventurer, has found the map to the tr