weinan030416

导航

lowbit

求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;
}

 

posted on 2023-01-31 12:43  楠030416  阅读(18)  评论(0编辑  收藏  举报