程序设计实习枚举作业 poj 2813 画家问题(枚举局部)
总时间限制: 1000ms 内存限制: 65536kB
描述
有一个正方形的墙,由N*N个正方形的砖组成,其中一些砖是白色的,另外一些砖是黄色的。Bob是个画家,想把全部的砖都涂成黄色。但他的画笔不好使。当他用画笔涂画第(i, j)个位置的砖时, 位置(i-1, j)、 (i+1, j)、 (i, j-1)、 (i, j+1)上的砖都会改变颜色。请你帮助Bob计算出最少需要涂画多少块砖,才能使所有砖的颜色都变成黄色。
输入
第一行是一个整数n (1≤n ≤15),表示墙的大小。接下来的n行表示墙的初始状态。每一行包含n个字符。第i行的第j个字符表示位于位置(i,j)上的砖的颜色。“w”表示白砖,“y”表示黄砖。
输出
一行,如果Bob能够将所有的砖都涂成黄色,则输出最少需要涂画的砖数,否则输出“inf”。
样例输入
5
wwwww
wwwww
wwwww
wwwww
wwwww
样例输出
15
来源
poj 1681
直接枚举肯定会超时,注意到按照行的顺序枚举,第一行的操作唯一确定了后面几行的合法操作,所以采用枚举第一行操作的思路。第一次做使用位运算做,效率较高。第二次做到时候为了节省代码量采用了一种虚拟边框的方法,,也没有使用位运算而直接储存,故效率不如第一版。本题也可以用异或方程组,但是实现困难,而且最后对解的自由维度也必须枚举,复杂度上并没有优势,加上代码复杂度较高,而且我高斯消元不熟练所以没有写。
以下为代码
version 1
Accepted 256kB 100ms 1086 B
#define INF 225
#include<stdio.h>
long int row[16]={
0},record[15]={
0};
int n,minStep=INF,step;
int get(int m,int j)
{
if (j==-1 || j==n)
return 0;
else
return (m&(1<<j))>>j;
}
void readIn()
{
char ch;