记录编号 |
7848 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
题目名称 |
奥术能量环流 |
最终得分 |
100 |
用户昵称 |
zqzas |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.183 s |
提交时间 |
2008-11-11 21:17:48 |
内存使用 |
1.57 MiB |
显示代码纯文本
#include <iostream>
#define MAXN 111
using namespace std;
const int Dir[4][2][2]={ {{-1,1},{0,0}}, {{1,-1},{0,0}} , {{0,0},{-1,1}} ,{{0,0},{1,-1}} };
int n,m,ans,c,used[MAXN][MAXN],visit[MAXN][MAXN][3],dir[MAXN][MAXN][8][3];
void dfs(int x,int y,int st)
{
int d,a,b;
for (d=0;d<4;d++)
{
if (dir[x][y][d][st])
{
a=x+Dir[d][0][st];
b=y+Dir[d][1][st];
if (a>=1 && a<=n && b>=1 && b<=m)
{
if (used[a][b]==0 && visit[a][b][st]!=c)
{
visit[a][b][st]=c;
dfs(a,b,st);
}
}
}
}
}
void run()
{
int i,j,p,q,now;
ans=c=0;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
{
if (used[i][j]==0)
{
c++;
visit[i][j][0]=visit[i][j][1]=c;
dfs(i,j,0);
dfs(i,j,1);
now=0;
for (p=1;p<=n;p++)
for (q=1;q<=m;q++)
{
if (visit[p][q][0]==c && visit[p][q][1]==c)
{
used[p][q]=1;
now++;
}
}
if (now>1)
ans++;
}
}
}
void ini()
{
int i,j,a,d,x,y;
cin>>n>>m;
for (i=1;i<=n;i++)
for (j=1;j<=m;j++)
{
cin>>a;
dir[i][j][0][0]=( (a & (1<<3) )==1<<3);
dir[i][j][1][0]=( (a & (1<<2) )==1<<2);
dir[i][j][2][0]=( (a & (1<<1) )==1<<1);
dir[i][j][3][0]=( (a & (1) )==1);
for (d=0;d<4;d++)
{
if (dir[i][j][d][0]!=0)
{
x=i+Dir[d][0][0];
y=j+Dir[d][1][0];
if (x>=1 && x<=n && y>=1 && y<=m)
{
dir[x][y][d][1]=1;
}
}
}
}
}
int main()
{
freopen("arcane.in","r",stdin);
freopen("arcane.out","w",stdout);
ini();
run();
cout<<ans;
return 0;
}