Codeforces 45 J. Planting Trees

問題

nxmのマスに1〜nの異なる数字を、
隣接するどの2マスの数字の差も2以上であるように入れたい。


そのような入れ方を1通り出力せよ。
不可能な場合-1を出力せよ。

制約条件

n,m≦100

方針

書いて実験してみると、
(1,2),(1,3),(2,2)の場合が不可能であるが、
その他の場合は答えがあるように見える。


しかも結構自由に埋められる感じがする。
なので適当に深さ優先探索で答えを1通りだけ探してやればよい。

ソースコード

int n,m;
int ans[100][100];
bool use[10001];

bool dfs(int y,int x){
	if(x==m)return dfs(y+1,0);
	if(y==n)return 1;
	rep(i,n*m)if(!use[i+1]){
		use[i+1]=1;
		ans[y][x]=i+1;
		for(int dy=-1;dy<1;dy++)for(int dx=-1;dx<1;dx++)if(dy||dx){
			int ny=y+dy, nx=x+dx;
			if(ny<0||nx<0||dy==dx)continue;
			if(abs(ans[ny][nx]-ans[y][x])<2)goto FAIL;
		}
		if(dfs(y,x+1))return 1;
		FAIL:;
		use[i+1]=0;
	}
	return 0;
}
void run()
{
	cin>>n>>m;
	if(!dfs(0,0)){
		cout<<-1<<endl;
		return;
	}
	rep(i,n)rep(j,m)cout<<ans[i][j]<<(j==m-1?"\n":" ");
}