枚举法(啊哈!算法)

------------恢复内容开始------------

有穷的枚举

1.炸弹人

#include<iostream>
using namespace std;
char map[1001][1001];
int n,m,x,y,sum,max1,mx,my;
int main(){
    cin>>n>>m;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin>>map[i][j];
        }
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(map[i][j] =='.'){
                sum=0;
                x=i;
                y=j;
                while(map[x][y] !='#' ){
                    if(map[x][y] =='G'){
                        sum++;
                    }
                    x--;
                } 
                
                x=i;
                y=j;
                while(map[x][y] !='#'){
                    if(map[x][y] =='G'){
                        sum++;
                    }
                    x++;
                }
                x=i;
                y=j;
                while(map[x][y] !='#'){
                    if(map[x][y] =='G'){
                        sum++;
                    }
                    y++;
                }
                x=i;
                y=j;
                while(map[x][y] !='#'){
                    if(map[x][y] =='G'){
                        sum++;
                    }
                            y--;
                }
                    if(sum > max1){
                max1=sum;
                mx=i;
                my=j;
                }

            }
        
        }
    }
    cout<<max1<<" from point at "<<mx<<' '<<my;
}

用BFS解决炸弹人问题中遗留的BUG

#include<iostream>
using namespace std;
struct node{
    int x;
    int y;
};
int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
char map[1001][1001];
int book[1001][1001];
int head,tail;
int n,m,startx,starty,count,p,q;
int mnum=-100;
int getsum(int x,int y){
    int a,b,sum;
    sum=0;
    a=x;
    b=y;
    while(map[a][b] !='#'){
        a--;
        if(map[a][b] =='P'){
            sum++;    
        }
    }
    a=x;
    b=y;
    while(map[a][b] !='#'){
        b++;
        if(map[a][b] =='P'){
            sum++;    
        }
    }
    a=x;
    b=y;
    while(map[a][b] !='#'){
        a++;
        if(map[a][b] =='P'){
            sum++;    
        }
    }
    a=x;
    b=y;
    while(map[a][b] !='#'){
        b--;
        if(map[a][b] =='P'){
            sum++;    
        }
    }
    return sum;  
}
int main(){
    int tx,ty;
    struct node boom[1001];
    cin>>n>>m>>startx>>starty;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            cin>>map[i][j];
        }
    }
    boom[tail].x=startx;
    boom[tail].y=starty;
    tail++;
    book[startx][starty]=1;
    mnum=getsum(startx,starty);
    while(head!=tail){
        for(int i=0;i<=3;i++){
            tx=boom[head].x+dir[i][0];
            ty=boom[head].y+dir[i][1];
            if(tx>=0 && tx<n && ty>=0 && ty<m && map[tx][ty]=='.' && !book[tx][ty]){
                book[tx][ty]=1;
                boom[tail].x=tx;
                boom[tail].y=ty;
                tail++;
                count=getsum(tx,ty);
                if(count>mnum){
                    mnum=count;
                    p=tx;
                    q=ty;
                }
            }
        }
        head++;
    }
    cout<<"At the point of :" <<'('<<p<<','<<q<<')' << "kill "<<mnum<<endl;
    return 0;
    
}

 

2.火柴棍等式

计算机大概1S计算10的8次方次

#include<iostream>
using namespace std;
int a[10]={6,2,5,5,4,5,6,3,7,6};
int sum;
int count;
int fun(int x){
    sum=0;
    while(x/10){
        sum+=a[x%10];
        x=x/10;
    }
    sum+=a[x];
    return sum;
}
int main(){
    int n;
    int c;
    cin>>n;
    for(int i=0;i<=11111;i++){
        for(int j=0;j<=11111;j++){
            c=i+j;
            if(fun(i)+fun(j)+fun(c)==n-4){
                count++;
            }
        }
    }
    cout<<count; 
}

3.全排列

 123456789的全排列9!

#include<iostream>
using namespace std;
int num;
int main(){
    for(int a=1;a<=9;a++){
        for(int b=1;b<=9;b++){
            for(int c=1;c<=9;c++){
                for(int d=1;d<=9;d++){
                    for(int e=1;e<=9;e++){
                        for(int f=1;f<=9;f++){
                            for(int g=1;g<=9;g++){
                                for(int h=1;h<=9;h++){
                                    for(int j=1;j<=9;j++){
                                        if(a!=b&&a!=c&&a!=d&&a!=e&&a!=f&&a!=g&&a!=h&&a!=j
                                        &&b!=c&&b!=d&&b!=e&&b!=f&&b!=g&&b!=h&&b!=j
                                        &&c!=d&&c!=e&&c!=f&&c!=g&&c!=h&&c!=j
                                        &&d!=e&&d!=f&&d!=g&&d!=h&&d!=j
                                        &&e!=f&&e!=g&&e!=h&&e!=j
                                        &&f!=g&&f!=h&&f!=j
                                        &&g!=h&&g!=j
                                        &&h!=j)
                                        num++;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    cout<<num;

}

 

 

------------恢复内容结束------------

posted on 2020-03-28 19:53  二进制dd  阅读(216)  评论(0编辑  收藏  举报

导航