您的位置:首页 > 其它

UVA 657 - The die is cast

2013-01-18 10:08 253 查看
这题的数据有点坑
http://acm.uva.es/board/viewtopic.php?f=7&t=1948&p=205340&hilit=657&sid=379f9c1d7545875d9ac885e9fcb2383f#p205340
这里是讨论版,上面有些刁钻的数据

用了2个函数dfs1,dfs2

dfs2对X进行拓展.

因为数据有可能是这样的:

10 2

..X**X***X

..XXXX....

X可能不被*包围着,所以对visited的用了3中值,0表示未访问,1表示已经访dfs1拓展过,2表示是dfs2拓展开来的,而未经过dfs1的拓展.

所以对着visited值为2的要重新进行dfs1一下,写的比较烂

#include <iostream>
#include <vector>
#include <algorithm>
#include <memory.h>
using namespace std;

int h,w;
vector<int> r;
vector<int> t;
char im[52][52];
char visited[52][52];

void dfs2(int i,int j){
if (im[i][j]!='X'||visited[i][j])return;
visited[i][j]=2;
dfs2(i-1,j);
dfs2(i+1,j);
dfs2(i,j-1);
dfs2(i,j+1);
}
void dfs1(int i,int j){
if (visited[i][j]==0&&im[i][j]=='X')
{
t.push_back(1);
dfs2(i,j);
dfs1(i-1,j);
dfs1(i+1,j);
dfs1(i,j-1);
dfs1(i,j+1);
}
else if(visited[i][j]==2&&im[i][j]=='X'){
visited[i][j]=1;
dfs1(i-1,j);
dfs1(i+1,j);
dfs1(i,j-1);
dfs1(i,j+1);
}
else if(!visited[i][j]&&im[i][j]=='*'){
visited[i][j]=1;
dfs1(i-1,j);
dfs1(i+1,j);
dfs1(i,j-1);
dfs1(i,j+1);
}
}

int main(){
int c=1;
while (1)
{
cin>>w>>h;
if(h==0&&w==0)break;
int i;
memset(im,'.',sizeof(im));
memset(visited,0,sizeof(visited));
for (i=1;i<=h;++i)
{
for (int j=1;j<=w;++j)
{
cin>>im[i][j];
}
}

r.clear();
for (i=1;i<=h;++i)
{
for (int j=1;j<=w;++j)
{

if(im[i][j]!='.'&&!visited[i][j]){
t.clear();
dfs1(i,j);
r.push_back(t.size());
}
}
}
sort(r.begin(),r.end());
cout<<"Throw "<<c++<<endl;
for (i=0;i<r.size();++i)
{
cout<<r[i];
if(i+1!=r.size())cout<<' ';
}
cout<<endl<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: