当前位置:   article > 正文

C++回溯算法

C++回溯算法

迷宫的所有路径

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. void f(int,int),print();
  4. int n,m;
  5. int dx[]={0,1,0,-1};
  6. int dy[]={1,0,-1,0};
  7. char a[100][100];
  8. bool flag=false;
  9. struct point{
  10. int x,y;
  11. };
  12. point r[10000];
  13. int lr=0;
  14. int main()
  15. {
  16. system("color 1");
  17. cin>>n;
  18. for(int i=1;i<=n;i++){
  19. for(int j=1;j<=m;j++){
  20. cin>>a[i][j];
  21. }
  22. }
  23. f(1,1);
  24. return 0;
  25. }
  26. void f(int x,int y){
  27. a[x][y]='o';
  28. r[lr].x=x;
  29. r[lr].y=y;
  30. lr++;
  31. if(x==n&&y==m){
  32. print();
  33. return;
  34. }
  35. for(int i=0;i<4;i++){
  36. int tx=x+dx[i];
  37. int ty=y+dy[i];
  38. if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&a[tx][ty]=='.'&&flag==false){
  39. a[tx][ty]='o';
  40. f(tx,ty);
  41. lr--;
  42. a[tx][ty]='.';
  43. }
  44. }
  45. return;
  46. }
  47. void print(){
  48. for(int i=1;i<=n;i++){
  49. for(int j=1;j<=m;j++){
  50. cout<<setw(3)<<a[i][j];
  51. }
  52. cout<<endl;
  53. }
  54. for(int i=0;i<lr;i++){
  55. cout<<"("<<r[i].x<<","<<r[i].y<<") ";
  56. }
  57. }

LETTERS

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. void f(int,int,int);
  4. int n,m,ma=0;
  5. int dx[]={0,1,0,-1};
  6. int dy[]={1,0,-1,0};
  7. char a[100][100];
  8. bool flag=false,c[100];
  9. struct point{
  10. int x,y;
  11. };
  12. point r[10000];
  13. int lr=0;
  14. int main()
  15. {
  16. system("color 1");
  17. cin>>n>>m;
  18. for(int i=1;i<=n;i++){
  19. for(int j=1;j<=m;j++){
  20. cin>>a[i][j];
  21. }
  22. }
  23. f(1,1,1);
  24. cout<<ma;
  25. return 0;
  26. }
  27. void f(int x,int y,int cnt){
  28. c[(int)a[x][y]]=true;
  29. ma=max(ma,cnt);
  30. for(int i=0;i<4;i++){
  31. int tx=x+dx[i];
  32. int ty=y+dy[i];
  33. if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&c[(int)a[tx][ty]]==false){
  34. f(tx,ty,cnt+1);
  35. c[(int)a[tx][ty]]=false;
  36. }
  37. }
  38. return;
  39. }

棋盘问题

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. void f(int,int,int),print();
  4. bool iif(int,int);
  5. int n,m;
  6. char a[100][100];
  7. int sum=0;
  8. int main()
  9. {
  10. system("color 1");
  11. while(1){
  12. cin>>n>>m;
  13. if(n==-1&&m==-1) break;
  14. for(int i=0;i<n;i++){
  15. for(int j=0;j<m;j++){
  16. cin>>a[i][j];
  17. }
  18. }
  19. f(0,0,0);
  20. cout<<sum;
  21. }
  22. return 0;
  23. }
  24. void f(int x,int y,int cnt){
  25. if(cnt==m){
  26. sum++;
  27. return;
  28. }
  29. if(x==n){
  30. return;
  31. }
  32. for(int i=0;i<n;i++){
  33. if(iif(x,i)==true&&a[x][i]=='#'){
  34. a[x][i]='o';
  35. f(x+1,i,cnt+1);
  36. a[x][i]='#';
  37. }
  38. }
  39. return;
  40. }
  41. bool iif(int x,int y){
  42. for(int i=0;i<n;i++){
  43. if(a[x][i]=='o'&&i!=y) return false;
  44. }
  45. for(int i=0;i<n;i++){
  46. if(a[i][y]=='o'&&i!=x) return false;
  47. }
  48. return true;
  49. }
  50. void print(){
  51. cout<<"------------------------------------"<<endl;
  52. for(int i=0;i<n;i++){
  53. for(int j=0;j<n;j++){
  54. cout<<a[i][j];
  55. }
  56. cout<<endl;
  57. }
  58. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/726508
推荐阅读
相关标签
  

闽ICP备14008679号