Problem 2217 : Let's JUMPSTYLE

解法

深さ優先探索によって解ける。
ジャンプして、

  • 行き先がすでに判明したループだったら、今までの道にそのループの番号を入れる
  • 行き先が現在の道につながってしまったら、このループに新たな番号をつけ、今までの道にこの番号を入れる

のような関数を書けばよい。
全てのマスに対してこの関数を適用し、終了時のループの番号が答えとなる。

ソースコード

int n,x[100][100],y[100][100];
int v[100][100],nv;

int rec(int cy,int cx)
{
	int &c=v[cy][cx];
	if(c==-2)return nv++,-2;
	if(c>=0)return c;
	c=-2;
	
	int ny=y[cy][cx],nx=x[cy][cx],r=rec(ny,nx);
	c=r==-2?nv-1:r;
	return r;
}

int main()
{
	while(scanf("%d",&n),n)
	{
		rep(i,n)rep(j,n)scanf("%d%d",x[i]+j,y[i]+j),v[i][j]=-1;
		nv=0;
		rep(i,n)rep(j,n)if(v[i][j]<0)rec(i,j);
		printf("%d\n",nv);
	}
	return 0;
}