zoj1002-Fire Net

来源:互联网 发布:曼哈顿软件 编辑:程序博客网 时间:2024/06/05 05:36

原本打算用DFS写的,做完才发现思路变化了...神奇.   还有貌似按照老师的PDF,这题是出现并查集里面的...但是想不到怎么去并查..

 

#include<iostream>#include<cstring>using namespace std;char tmap[6][6],map[6][6];int num;void DFS(){for(int i=1;i<=num;i++)for(int j=1;j<=num;j++){if(tmap[i][j]=='.'){if(tmap[i-1][j-1]=='X'||tmap[i+1][j+1]=='X'||tmap[i+1][j-1]=='X'||tmap[i-1][j+1]=='X'){if(tmap[i][j-1]!='X'&&tmap[i][j+1]!='X'&&tmap[i+1][j]!='X'&&tmap[i-1][j]!='X')continue;}bool flag=true;for(int k=1;k<=num;k++)//右{if(j+k<5){if(tmap[i][j+k]=='@'){flag=false;break;}if(tmap[i][j+k]=='X')break;}}for(int k=1;k<=num;k++)//左{if(j-k>0){if(tmap[i][j-k]=='@'){flag=false;break;}if(tmap[i][j-k]=='X')break;}}for(int k=1;k<=num;k++)//下,从图上看{if(i+k<5){if(tmap[i+k][j]=='@'){flag=false;break;}if(tmap[i+k][j]=='X')break;}}for(int k=1;k<=num;k++)//上,从图上看{if(i-k>0){if(tmap[i-k][j]=='@'){flag=false;break;}if(tmap[i-k][j]=='X')break;}}if(flag)tmap[i][j]='@';}}}int main(){while(cin>>num&&num){int Account=0;memset(tmap,0,sizeof(tmap));memset(map,0,sizeof(map));for(int i=1;i<=num;i++)for(int j=1;j<=num;j++){cin>>tmap[i][j];map[i][j]=tmap[i][j];}DFS();for(int i=1;i<=num;i++)for(int j=1;j<=num;j++)if(tmap[i][j]=='@')Account++;int Account1=0;for(int i=1;i<=num;i++)//旋转90度再计算for(int j=1;j<=num;j++)tmap[i][num+1-j]=map[j][i];DFS();for(int i=1;i<=num;i++)for(int j=1;j<=num;j++)if(tmap[i][j]=='@')Account1++;if(Account>Account1)cout<<Account<<endl;elsecout<<Account1<<endl;}return 0;}


 

原创粉丝点击