// Slower C++ solution:
#include <bits/stdc++.h>

#define maxn 800

#define maxm 1009

using namespace std;

int b[maxn][maxn],a[maxn][maxn];

int  guass(int n)

{

	int i,j,p,row=0,col=0;

	for(;row<n&&col<n;row++,col++)

	{

		for(i=row,p=row;i<n;i++)

			if(a[i][col])

			{p=i;break;}

		if(p!=row)

			for(j=col;j<=n;j++)

				swap(a[p][j],a[row][j]);

		if(!a[row][col]) 

		{

			row--;

			continue;

		}

		for(i=row+1;i<n;i++)

			if(a[i][col])

			for(j=col+1;j<=n;j++)

				a[i][j]^=a[row][j];

	}

	for(i=row;i<n;i++)

		if(a[i][n]) return 0;

	return 1;

}

int main()

{

	int n,m,d;

	while(scanf("%d%d%d",&m,&n,&d)!=EOF&&n+m+d)

	{

		for(int i=0;i<n;i++)

		{

			for(int j=0;j<m;j++)

				scanf("%d",&b[i][j]);

		}

		memset(a,0,sizeof(a));

		for(int i=0;i<n;i++)

		{

			for(int j=0;j<m;j++)

			{

				a[i*m+j][n*m]=b[i][j];

				a[i*m+j][i*m+j]=1;

				for(int x=0;x<n;x++)

				{

					for(int y=0;y<m;y++)

					{

						if(abs(x-i)+abs(y-j)==d)

							a[i*m+j][x*m+y]=1;

					}

				}

			}

		}

		if(guass(n*m))

			puts("1");

		else

			puts("0");

	}

	return 0;

}

// Faster C++ solution for the same problem (measured speedup: 1.3393350163929212x):
//      whn6325689

//		Mr.Phoebe

//		http://blog.csdn.net/u013007900

#include <algorithm>

#include <iostream>

#include <iomanip>

#include <cstring>

#include <climits>

#include <complex>

#include <fstream>

#include <cassert>

#include <cstdio>

#include <bitset>

#include <vector>

#include <deque>

#include <queue>

#include <stack>

#include <ctime>

#include <set>

#include <map>

#include <cmath>

#include <functional>

#include <numeric>

#pragma comment(linker, "/STACK:1024000000,1024000000")





using namespace std;



typedef long long ll;

typedef long double ld;

typedef pair<ll, ll> pll;

typedef complex<ld> point;

typedef pair<int, int> pii;

typedef pair<pii, int> piii;

typedef vector<int> vi;



#define CLR(x,y) memset(x,y,sizeof(x))

#define mp(x,y) make_pair(x,y)

#define pb(x) push_back(x)

#define lowbit(x) (x&(-x))

#define MID(x,y) (x+((y-x)>>1))

#define eps 1e-9

#define PI acos(-1.0)

#define INF 0x3f3f3f3f

#define LLINF 1LL<<62



template<class T>

inline bool read(T &n)

{

    T x = 0, tmp = 1;

    char c = getchar();

    while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar();

    if(c == EOF) return false;

    if(c == '-') c = getchar(), tmp = -1;

    while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();

    n = x*tmp;

    return true;

}

template <class T>

inline void write(T n)

{

    if(n < 0)

    {

        putchar('-');

        n = -n;

    }

    int len = 0,data[20];

    while(n)

    {

        data[len++] = n%10;

        n /= 10;

    }

    if(!len) data[len++] = 0;

    while(len--) putchar(data[len]+48);

}

//-----------------------------------



const int MAXN=26*26;



int b[MAXN][MAXN],ans[MAXN];

int a[MAXN][MAXN];



int Guass(int n)

{

	int i,j,p,row=0,col=0;

	for(;row<n&&col<n;row++,col++)

	{

		for(i=row,p=row;i<n;i++)

			if(a[i][col])

			{p=i;break;}

		if(p!=row)

			for(j=col;j<=n;j++)

				swap(a[p][j],a[row][j]);

		if(!a[row][col]) 

		{

			row--;

			continue;

		}

		for(i=row+1;i<n;i++)

			if(a[i][col])

			for(j=col+1;j<=n;j++)

				a[i][j]^=a[row][j];

	}

	for(i=row;i<n;i++)

		if(a[i][n]) return 0;

	return 1;

}



int main()

{

//	freopen("data.txt","r",stdin);

	int n,m,d;

	while(read(m)&&read(n)&&read(d)&&(n+m+d))

	{

		CLR(a,0);

		for(int i=0;i<n;i++)

			for(int j=0;j<m;j++)

				read(b[i][j]);

		for(int i=0;i<n;i++)

			for(int j=0;j<m;j++)

			{

				a[i*m+j][n*m]=b[i][j];

				a[i*m+j][i*m+j]=1;

				for(int x=0;x<n;x++)

					for(int y=0;y<m;y++)

						if(abs(x-i)+abs(y-j)==d)

							a[i*m+j][x*m+y]=1;

			}

		if(Guass(n*m))

			puts("1");

		else

			puts("0");

	}

	return 0;

}