题目地址:点击打开链接
一共15盏灯,每盏灯亮或不亮,一共就2^15种可能,所有的遍历一遍就可以了。
判断两个表达方式相不相同的时候用hash的方法,空间换时间。
#include <iostream> #include <string> #include <vector> #include <algorithm> #include <cmath> #include <cstring> using namespace std; const int maxsize = 33000; int isOn[maxsize][15]; vector<int> vi; int N,P; string s[110]; int has[maxsize]; void init(int &num) { if(vi.size()==15) { for(int i=0;i<15;++i) isOn[num][14-i]=vi[i]; ++num; } else { vi.push_back(0); init(num); vi.pop_back(); vi.push_back(1); init(num); vi.pop_back(); } } int main() { int temp=0; init(temp); int cas; while(cin>>cas) { while(cas--) { cin>>P>>N; cin.get(); int i; for(i=0;i<N;++i) getline(cin,s[i]); int num=20; int num_of_all_posibles=(int)pow(2,P); for(i=0;i<num_of_all_posibles;++i) { memset(has,0,sizeof(has)); int j; for(j=0;j<N;++j) { int x=0; for(int k=0;k<P;++k) { if(isOn[i][k]==1) x=x*2+s[j][2*k]-‘0‘; else x=x*2; } if(has[x]==0) has[x]=1; else break; } if(j==N) { int min_num=0; for(int k=0;k<P;++k) min_num+=isOn[i][k]; if(min_num<num) num=min_num; } } cout<<num<<endl; } } return 0; }
UVa11205 - The broken pedometer,布布扣,bubuko.com
UVa11205 - The broken pedometer
原文:http://blog.csdn.net/leizh007/article/details/22220771