PKU演習問メモ(9/17)

もういやもういやもういやもういやもういやもういやもういや

No. 問題名 問題の種類および解法 難易度
2918 Tudoku 実装 ★★☆☆☆

2918 Tudoku

問題概要

Sudokuの簡単なバージョン(盤面を全て一意に決めていくことができるので探索の必要がない)

解法
ソースコード
int row[9],col[9],box[9];
char in[9][10];

int main()
{
	int CS; scanf("%d",&CS);
	rep(cs,CS)
	{
		rep(i,9)scanf("%s",&in[i]);
		rep(i,9)row[i]=col[i]=box[i]=0;
		
		int cnt=0;
		rep(i,9)rep(j,9)if(in[i][j]!='0')
		{
			cnt++;
			int t=1<<in[i][j]-'1';
			row[i]|=t; col[j]|=t; box[i/3*3+j/3]|=t;
		}
		while(cnt<81)
		{
			rep(i,9)rep(j,9)if(in[i][j]=='0')
			{
				int t=(1<<9)-1;
				t&=~row[i]&~col[j]&~box[i/3*3+j/3];
				
				int u=-1;
				rep(k,9)if(t&1<<k)
				{
					if(u==-1)u=k;
					else u=-2;
				}
				if(u<0)continue;
				cnt++; in[i][j]='1'+u;
				row[i]|=1<<u; col[j]|=1<<u; box[i/3*3+j/3]|=1<<u;
			}
		}
		printf("Scenario #%d:\n",cs+1);
		rep(i,9)puts(in[i]); puts("");
	}
	return 0;
}