求1最低位置(不打表)
#include<iostream> #include<cmath> using namespace std; int lowbit(int n) { return n&-n; } int posof(int n) { return log10(n)/log10(2); } int main() { int n; cin>>n; cout<<posof(n); }
打表
#include <iostream> using namespace std; #define maxn 16 int log2[1<<maxn]; void buildlog2table(int n) { for(int k=0;k<=n;k++) log2[1<<k]=k; } int lowbit(int n) { return n&-n; } int posof(int n) { return log2[lowbit(n)]; } int main() { buildlog2table(maxn); int n; cin>>n; cout<<posof(n); }
求二进制最低位1和后面的0构成的数
#include<iostream> #include<cstring> using namespace std; int main() { int t; cin>>t; cout<<(t&(-t)); }
求二进制中1的个数
#include<iostream> using namespace std; //补全下列两个函数即可 int lowbit(int n) { //write your code here return n&-n; } int NumberOf1(int n) { int res = 0; while(n) { n-=lowbit(n); res+=1; } //write your code here return res; }
图1是海拉鲁城堡的地形图。请你编写一个程序,计算该城堡一共有多少房间,最大的房间有多大。
城堡被分割成m×n(m≤50,n≤50)个方块,每个方块可以有0~4面墙。
输入
前两行是两个整数,分别是南北向、东西向的方块数(行和列)。
在接下来的输入行里,每个方块用一个数字p表示(0≤p≤50)。其二进制位为1代表有墙,为0代表无墙。
四面墙由整数P的后四位表示。最低位代表西墙(0001),第二位代表北墙(0010),第三位4表示东墙(0100),第四位表示南墙(1000)。
四个数相加的和就是每个方块的四面墙的状态。
输入数据中每个方块的内墙是重叠的,方块(1,1)的南墙同时也是方块(2,1)的北墙。
输入的数据保证城堡至少有两个房间。
输出
海拉鲁城堡的房间数、海拉鲁城堡中最大房间所包括的方块数。
结果显示在标准输出设备上。
输入样例 1
4 7 11 6 11 6 3 10 6 7 9 6 13 5 15 5 1 10 12 7 13 7 5 13 11 10 8 10 12 13
输出样例 1
5 9
#include<iostream> #include<algorithm> #include<string.h> using namespace std; int row,column; const int N=60; int room[N][N]; int color[N][N]; int maxroomarea=0,roomno=0; int roomarea; bool isleftopen(int wall,int mask=1) {return (wall&mask)==0;} bool isupopen(int wall,int mask=2) {return (wall&mask)==0;} bool isrightopen(int wall,int mask=4) {return (wall&mask)==0;} bool isdownopen(int wall,int mask=8) {return (wall&mask)==0;} int dfs(int i,int k) { if(color[i][k]) { return 0; } ++roomarea; color[i][k]=roomno; if(isleftopen(room[i][k])) dfs(i,k-1); if(isupopen(room[i][k])) dfs(i-1,k); if(isrightopen(room[i][k])) dfs(i,k+1); if(isdownopen(room[i][k])) dfs(i+1,k); } int main() { cin>>row>>column; for(int i=1;i<=row;i++) { for(int j=1;j<=column;j++) cin>>room[i][j]; } memset(color,0,sizeof(color)); for(int i=1;i<=row;i++) { for(int j=1;j<=column;j++) { if(!color[i][j]) { ++roomno; roomarea=0; dfs(i,j); maxroomarea=max(maxroomarea,roomarea); } } } cout<<roomno<<endl; cout<<maxroomarea; return 0; }
标签:return,int,lowbit,mask,wall,include,方块 From: https://www.cnblogs.com/weinan030416/p/17078612.html