记录编号 7848 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 奥术能量环流 最终得分 100
用户昵称 Gravatarzqzas 是否通过 通过
代码语言 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;
}