栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

poj 3434 Terrarium

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

poj 3434 Terrarium

#include <cstdio>#include <cstdlib>#include <cstring>#include <iostream>#include <algorithm>#include <string>#include <queue>#include <stack>using namespace std;#define input(x) cin>>x#define print(x) cout<<x<<endl#define SIZE 1024#define elif else iftypedef struct cpoint{    int x,y;    cpoint(){}    cpoint(int i_x,int i_y)    {        x=i_x;y=i_y;    }    inline void setpoint(int i_x,int i_y)    {        x=i_x;y=i_y;    }        }cpoint;typedef struct snake{    char name;    int pos;    cpoint head;    queue<cpoint> body;}snake;int n,k;char g[SIZE][SIZE],visit[SIZE][SIZE];int nsnake=0;snake array[26];const int mx[]={0, 1,0,-1};const int my[]={-1,0,1, 0};inline void setvisit(const cpoint& cp){    visit[cp.y][cp.x]=1;}inline bool visited(const cpoint& cp){    return visit[cp.y][cp.x];}inline void printMap(){    for(int i=0;i<n;i++)    {        printf("%sn",g[i]);    }}int cmp(const void *a,const void *b){    snake *ta=(snake*)a,*tb=(snake*)b;    return ta->name-tb->name;}void fill_body(int x){    stack<cpoint> tmp;    bool first=true;    queue<cpoint> bfs;    cpoint head=array[x].head;    bfs.push(head);    memset(visit,0,sizeof(visit));    visited(head);    while(!bfs.empty())    {        cpoint t=bfs.front();        bfs.pop();        for(int i=0;i<4;i++)        { cpoint tt; tt.x=t.x+mx[i]; tt.y=t.y+my[i]; if(!visited(tt) && g[tt.y][tt.x]==array[x].name) {     bfs.push(tt);     tmp.push(tt);     if(first)     {         int tx=head.x-tt.x;         int ty=head.y-tt.y;         for(int j=0;j<4;j++)         {  if(tx==mx[j] && ty==my[j]) array[x].pos=j;         }         first=false;         if(array[x].pos<0 || array[x].pos>3) print("ERROR");     } } setvisit(tt);        }    }    while(!tmp.empty())    {        array[x].body.push(tmp.top());        tmp.pop();    }}int main(){    input(n>>k);    for(int i=0;i<n;i++)    {        scanf("%s",g[i]);        for(int j=0;g[i][j];j++)        { if(g[i][j]>='A' && g[i][j]<='Z') {     array[nsnake].head.setpoint(j,i);     array[nsnake].name=g[i][j]-'A'+'a';     nsnake++; }        }    }    qsort(array,nsnake,sizeof(snake),cmp);    for(int i=0;i<nsnake;i++) fill_body(i);    for(int i=0;i<k;i++)    {        for(int j=0;j<nsnake;j++)        { int pos=array[j].pos; if(array[j].head.y+my[pos]>=0 && array[j].head.y+my[pos]<n &&     array[j].head.x+mx[pos]>=0 && array[j].head.x+mx[pos]<n &&     g[array[j].head.y+my[pos]][array[j].head.x+mx[pos]]=='.') {     array[j].body.push(cpoint(array[j].head.x,array[j].head.y));     g[array[j].head.y][array[j].head.x]=array[j].name;     array[j].head.y+=my[pos];     array[j].head.x+=mx[pos];     g[array[j].head.y][array[j].head.x]=array[j].name-'a'+'A';     cpoint now=array[j].body.front();     g[now.y][now.x]='.';     array[j].body.pop(); } else {     int left=(pos-1)<0?(pos+3):(pos-1);     int right=(pos+1)%4;     if(array[j].head.y+my[right]>=0 && array[j].head.y+my[right]<n &&         array[j].head.x+mx[right]>=0 && array[j].head.x+mx[right]<n &&         g[array[j].head.y+my[right]][array[j].head.x+mx[right]]=='.')     {         array[j].body.push(cpoint(array[j].head.x,array[j].head.y));         g[array[j].head.y][array[j].head.x]=array[j].name;         array[j].head.y+=my[right];         array[j].head.x+=mx[right];         g[array[j].head.y][array[j].head.x]=array[j].name-'a'+'A';         cpoint now=array[j].body.front();         g[now.y][now.x]='.';         array[j].body.pop();         array[j].pos=right;     }     else if(array[j].head.y+my[left]>=0 && array[j].head.y+my[left]<n &&         array[j].head.x+mx[left]>=0 && array[j].head.y+mx[left]<n &&         g[array[j].head.y+my[left]][array[j].head.x+mx[left]]=='.')     {         array[j].body.push(cpoint(array[j].head.x,array[j].head.y));         g[array[j].head.y][array[j].head.x]=array[j].name;         array[j].head.y+=my[left];         array[j].head.x+=mx[left];         g[array[j].head.y][array[j].head.x]=array[j].name-'a'+'A';         cpoint now=array[j].body.front();         g[now.y][now.x]='.';         array[j].body.pop();         array[j].pos=left;     } }        }    }    printMap();    return 0;}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/376798.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号