USACO-Section2.1 The Castle[bfs]
来源:互联网 发布:sql select as table 编辑:程序博客网 时间:2024/06/06 12:52
题目
输入城堡的长和宽,然后长*宽个数据表示每个单元墙的情况,1西2北4东8南,0-15就可以表示任何一种围墙的情况。要求计算房间数,最大房间面积,凿掉某一堵墙后可能形成的最大房间面积以及这种情况下所凿的墙。
题目细节
数据都是没问题的,凿的墙用某房间的东或者北来表示,优先最西边的,再优先最南边的。
题解
首先处理墙的情况,具体操作就是判断是否大于8,大于就表示南边有墙,然后减去8,以此类推。
然后是广搜,使用一个房间号,广搜的时候把该起点所在房间的每一个单元都标上这个房间号,广搜结束后求得的是起点所在房间的面积,把所有标有这个数的单元,即这个起点所处房间的每个单元的面积都填上。然后到下一个没跑过的单元,以其为起点,再广搜。全部结束后已经可以得到最大房间的面积了。然后对每一个单元,计算它所在房间的面积,再加上它东或者北单元所在房间的面积(房间号要不同),就可以得到两个房间最大的面积和具体的哪一堵墙。
代码
/*ID: xcwhkh1LANG: C++TASK: castle*/#include <stdio.h>struct rm{ int wall[4];//0南,1东,2北,3西 int f,s,ss,ff,zu;};rm room[52][52];int r[52][52];int roomnum=0;void bfs(int a,int b){ room[a][b].f=1; room[a][b].ff=1; if(room[a][b].wall[0]==0&&room[a+1][b].f==0) { room[a+1][b].zu=room[a][b].zu; bfs(a+1,b); room[a][b].s+=room[a+1][b].s; } if(room[a][b].wall[1]==0&&room[a][b+1].f==0) { room[a][b+1].zu=room[a][b].zu; bfs(a,b+1); room[a][b].s+=room[a][b+1].s; } if(room[a][b].wall[2]==0&&room[a-1][b].f==0) { room[a-1][b].zu=room[a][b].zu; bfs(a-1,b); room[a][b].s+=room[a-1][b].s; } if(room[a][b].wall[3]==0&&room[a][b-1].f==0) { room[a][b-1].zu=room[a][b].zu; bfs(a,b-1); room[a][b].s+=room[a][b-1].s; }}int main(){ FILE *fin=fopen("castle.in","r"); FILE *fout=fopen("castle.out","w"); int l,w,rt=0,t,max; fscanf(fin,"%d%d",&l,&w);//长宽 for(int i=1;i<=w;i++) for(int j=1;j<=l;j++) { fscanf(fin,"%d",&rt); for(int k=0;k<4;k++) room[i][j].wall[k]=0; t=0; for(int k=8;k>0;k/=2) { if(rt>=k) { room[i][j].wall[t]=1; rt-=k; } t++; } } //bfs for(int i=1;i<=w;i++) for(int j=1;j<=l;j++) { if(room[i][j].ff==0) { roomnum++; room[i][j].zu=roomnum; for(int ii=1;ii<=w;ii++) for(int jj=1;jj<=l;jj++) { room[ii][jj].s=1; room[ii][jj].f=0; } bfs(i,j); room[i][j].ss=room[i][j].s; if(room[i][j].s>max) max=room[i][j].s; } } for(int i=1;i<=w;i++) for(int j=1;j<=l;j++) if(room[i][j].zu) for(int ii=1;ii<=w;ii++) for(int jj=1;jj<=l;jj++) if(room[ii][jj].zu==room[i][j].zu&&room[ii][jj].ss) room[i][j].s=room[ii][jj].ss; int maxs=0; int x,y; char push; if(l==1) { for(int i=w;i>1;i--) if(room[i][1].s+room[i-1][1].s>maxs&&room[i][1].zu!=room[i-1][1].zu) { maxs=room[i][1].s+room[i-1][1].s; x=1; y=i; push='N'; } } else if(w==1) { for(int j=1;j<l;j++) if(room[1][j].s+room[1][j+1].s>maxs&&room[1][j].zu!=room[1][j+1].zu) { maxs=room[1][j].s+room[1][j+1].s; x=j; y=1; push='E'; } } else { for(int j=1;j<=l;j++) for(int i=w;i>=1;i--) { if(i!=1&&room[i][j].s+room[i-1][j].s>maxs&&room[i][j].zu!=room[i-1][j].zu) { maxs=room[i][j].s+room[i-1][j].s; x=i; y=j; push='N'; } if(j!=l&&room[i][j].s+room[i][j+1].s>maxs&&room[i][j].zu!=room[i][j+1].zu) { maxs=room[i][j].s+room[i][j+1].s; x=i; y=j; push='E'; } } }// for(int i=1;i<=w;i++)// {// for(int j=1;j<=l;j++)// printf("%d ",room[i][j].s);// printf("\n");// } fprintf(fout,"%d\n%d\n%d\n%d %d %c\n",roomnum,max,maxs,x,y,push); return 0;}
阅读全文
0 0
- USACO-Section2.1 The Castle[bfs]
- USACO-Section2.1 The Castle
- USACO-Section2.1 The Castle【深度优先搜索】
- USACO-Section2.1 The Castle [搜索][深度优先搜索]
- USACO 2.1.1The Castle
- [USACO 2.1.1] The Castle
- USACO 2.1.1The Castle
- USACO 2.1.1 The Castle
- USACO-2.1.1- The Castle
- USACO 2.1 The Castle (castle)
- USACO 2.1.1The Castle城堡
- USACO-cha2-sec2.1 The Castle
- USACO:2.1.1 The Castle 城堡
- The Castle(USACO 2.1.1)
- 【图论】【USACO】The Castle
- usaco-the castle
- USACO Chapter2 The Castle
- USACO:PROB The Castle
- sql
- 赫夫曼树以及赫夫曼编码
- 514. Freedom Trail
- 文件上传—jspSmartUpload组件
- linux命令行下软件的安装等操作-软件包管理
- USACO-Section2.1 The Castle[bfs]
- [Microsoft] O(1) Check Power of 2
- C# 接收post到后台的json数据
- IDL之参数和关键字
- 十二天
- 多线程爬取糗事百事百科
- 可变字符串的基本操作
- fzuoj 2186 小明的迷宫 bfs+bfs状压+剪枝
- java从入门到入土(3)文件上传