枚举法(啊哈!算法)
------------恢复内容开始------------
有穷的枚举
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; }
------------恢复内容结束------------