洛谷——《搜索》

#include<iostream>
#include<iomanip>
#include<cmath>
#include<string.h>
#include<string>
#include <ctime>
#include<cstdlib>
#include<algorithm>
#include<cstdio>
#include<queue>
using namespace std;

// p1219
// 1.深度优先搜索
// int arr[40];
// bool a[100],b[100],c[100];//分别表示纵还有对角线
// int n,ans = 0;
// void dfs(int num)
// {
//     if(num>n)//判断位置
//     {
//         if(ans<3)
//         {
//             for(int i =1;i<=n;i++)
//             {
//                cout<<arr[i]<<' '; 
//             }  
//             cout<<endl;
            
//         }
//         ans++;  
//         return ;
//     }

//     for(int i =1;i<=n;i++)//所有可能的列
//     {
//         if(a[i]==0&&b[i+num]==0&&c[num-i+15]==0)
//         {
//             arr[num] =i;
//             a[i]=1;b[i+num]=1;c[num-i+15]=1;
//             dfs(num+1);
//             a[i]=0;b[i+num]=0;c[num-i+15]=0;

//         }
//     }
// }
// int main()
// {
//     cin>>n;
//     dfs(1);
//     cout<<ans;
// }


//p2392
// 1.dfs 找到每个学科小于一半总耗时的最大耗时

// int s[10],a[100];
// int ans,sum;
// int maxdeep,maxtime,nowtime;
// void dfs(int num)//层数,获得最大耗时
// {
//     if(num>maxdeep)
//     {
//         maxtime = max(maxtime,nowtime);//更新最大耗时
//         return ;
//     }
//     if(nowtime+a[num]<=sum/2)
//     {
//         nowtime +=a[num];
//         dfs(num+1);
//         nowtime -=a[num];
//     }
//     dfs(num+1);//跳过
// }
// int main()
// {
//     for(int i =1;i<=4;i++)cin>>s[i];//放s
//     for(int i =1;i<=4;i++)
//     {
//         //最大层数
//         maxdeep = s[i];
//         sum =0;
//         maxtime =0;
//         for (int j = 1; j <= s[i]; j++)
//         {
//             cin>>a[j];
//             sum+=a[j];//求和
//         }
//         dfs(1);
//         ans +=(sum-maxtime);
//     }
//     cout<<ans;
// }

//p1443
// 1.广度优先,最短路径

// int arr[1000][1000];
// int n,m,x,y;
// int walk[8][2] = {{2,1},{2,-1},{1,2},{1,-2},{-2,1},{-2,-1},{-1,2},{-1,-2}};
// struct coord
// {
//     int x,y;
// };
// queue<coord>Q;
// int main()
// {
//     cin>>n>>m>>x>>y;
//     memset(arr,-1,sizeof(arr));//表示没有经过
//     coord temp = {x,y};//初始化
//     Q.push(temp);
//     arr[x][y] = 0;
//     while(!Q.empty())
//     {
//         coord u = Q.front();//取出第一个
//         int ux = u.x,uy = u.y;
//         Q.pop();//弹出第一个
//         for(int i =0;i<8;i++)
//         {
//             int x = ux +walk[i][0],y = uy +walk[i][1];
//             int d = arr[ux][uy];
//             if(x<1||x>n||y<1||y>m||arr[x][y]!=-1)continue;
//             arr[x][y] = d+1;
//             coord temp = {x,y};
//             Q.push(temp);//放入
//         }
//     }
//     for(int i =1;i<=n;i++)
//     {
//         for(int j =1;j<=m;j++)
//         {
//             cout<<arr[i][j]<<"   ";
//         }
//         cout<<endl;
//     }
// }

// p1135
// 1.结构体包含层数和k值
// 2.队列访问上下k值找到层数为5为止

// struct coord
// {
//     int pos,k,time;
//     int find = -1;
// }arr[1000];
// int n,a,b;
// int ans;
// queue<coord>Q;
// int main()
// {
//     cin>>n>>a>>b;
//     for(int i =1;i<=n;i++)//初始化楼层
//     {
//         arr[i].pos = i;
//         cin>>arr[i].k;
//     }
//     //获得首队
//     arr[1].time = 0;
//     coord item = arr[a];
//     Q.push(item);
//     while(!Q.empty())
//     {
//         item = Q.front();//获得首队
//         int pos = item.pos,k = item.k;
//         Q.pop();//去除首队
//         if(pos==b)break;
//         if(pos+k<=n&&arr[pos+k].find==-1)//满足条件
//         {
//             //加入列队
//             arr[pos+k].time = arr[pos].time+1;
//             arr[pos+k].find = 1;
//             Q.push(arr[pos+k]);

//         }
//         if(pos-k>=1&&arr[pos-k].find==-1)
//         {
//             arr[pos-k].time = arr[pos].time+1;
//             arr[pos-k].find = 1;
//             Q.push(arr[pos-k]);
//         }
//     }
//     ans = item.time;
//     if(item.pos!=b)ans=-1;
//     cout<<ans;
// }

//2895
//列队条件为陨石降临
// struct coord
// {
//     int x,y;
//     int find_time;
// };
// queue<coord>Q;
// int m,x,y,t,ans;
// int arr[1000][1000];
// int brr[1000][1000];

// int a[5] = {0,-1,0,1,0};
// int b[5] = {0,0,1,0,-1};

// void my_break()
// {
//     for(int i =0;i<=4;i++)
//     {
//         int ux = x+a[i],uy = y+b[i];
//         if(ux>=0&&uy>=0&&arr[ux][uy]==-1)arr[ux][uy] = t;
//         if(ux>=0&&uy>=0&&arr[ux][uy]>t)
//         {
//             arr[ux][uy] = t;
//         }
//     }
// }
// int main()
// {
//     cin>>m;
//     memset(arr,-1,sizeof(arr));
//     for(int k =0;k<m;k++)
//     {
//         cin>>x>>y>>t;
//         my_break();
//     }//时间初始化完成
//     //获得首列
//     coord item = {0,0,0};
//     Q.push(item);
//     while (!Q.empty())
//     {
//         item = Q.front();
//         Q.pop();
//         int ux = item.x,uy = item.y;//获得此时位置
//         if(arr[ux][uy]==-1)break;
//         // 枚举周围位置
//         for(int i =1;i<=4;i++)
//         {
//             int tx = ux+a[i],ty = uy+b[i];//下一个位置
            
//             if(tx>=0&&ty>=0&&(arr[tx][ty]>item.find_time+1||arr[tx][ty]==-1)&&brr[tx][ty]==0)
//             {
//                 //放入队列
//                 coord next;
//                 next.x = tx,next.y = ty,next.find_time=item.find_time+1;
//                 Q.push(next);
//                 brr[tx][ty]=1;
//             }
//         }
//     }
//     ans = item.find_time;
//     if(arr[item.x][item.y]!=-1)ans = -1;
//     cout<<ans;
// }

//p1433
// 1.求数量使用深度

// int arr[10][10];
// int walk[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};
// int n,m,t,sx,fx,sy,fy;
// int x,y,ans;
// void dfs(int mx,int my)
// {
//     arr[mx][my] =0;
//     if(mx==fx&&my==fy)//出口
//     {
//         ans++;
//         return;
//     }
//     for(int i =0;i<4;i++)//下一步可能情况
//     {
//         int ux = mx+walk[i][0],uy = my+walk[i][1];
//         if(ux<1||ux>n||uy<1||uy>m||arr[ux][uy]!=-1)continue;
//         arr[ux][uy] =0;
//         dfs(ux,uy);
//         arr[ux][uy] = -1;
//     }
// }

// int main()
// {
//     cin>>n>>m>>t;
//     memset(arr,-1,sizeof(arr));
//     cin>>sx>>sy>>fx>>fy;
//     for(int i =0;i<t;i++)
//     {
//         cin>>x>>y;
//         arr[x][y] =0;//表示障碍物
//     }//初始化完成
//     dfs(sx,sy);
//     cout<<ans;
// }

//p1019
// 1.深度优先搜索
// 2.枚举所有有重合的项

// string arr[20];
// int use[20];
// int n,ans,len;
// int max_len(string a,string b)//字符串重合长度
// {
//     for(int i =1;i<min(a.length(),b.length());i++)//i=1避免了包含关系
//     {
//         int flag =1;
//         for(int j =0;j<i;j++)
//         {
//             if(a[a.length()-i+j]!=b[j])flag =0;
//         }
//         if(flag)return i;
//     }
//     return 0;
// }
// void dfs(string a,int max_length)
// {
//     len = max(len,max_length);//获得最大字符串长度
//     for(int i =0;i<n;i++)//遍历所有字符
//     {
//         if(use[i]<2)//满足条件
//         {
//             int c =max_len(a,arr[i]);
//             if(c>0)
//             {
//                 use[i]++;
//                 dfs(arr[i],max_length+arr[i].length()-c);
//                 use[i]--;
//             }
           
//         }
//     }

// }
// int main()
// {
//     cin>>n;
//     for(int i =0;i<=n;i++)cin>>arr[i];
//     dfs(' '+arr[n],1);
//     cout<<len;
    
// }


//1101
// 1.深度优先搜索
// 2.枚举八个方向
// 3.判断条件为八个方向中有一个是自己的前项
// (不会)
// char arr[100][100];
// char s[8] = "yizhong";
// int walk[8][2] = {{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};
// int n;
// bool brr[100][100] = {0};
// bool find(char a,char b)
// {
//     if(a=='y')return true;
//     int pos_a =0,pos_b =0;
//     while(s[pos_b]!=b&&pos_b<8)pos_b++;
//     while(s[pos_a]!=a&&pos_a<8)pos_a++;
//     if(pos_a==7||pos_b==7)return false;
//     else if(pos_a=pos_b+1)return true;
//     else return false;
// }
// void dfs(int i,int j)
// {
//     if(i*j==n*n)return;
//     for(int k =0;k<8;k++)
//     {
//         int x = i+walk[k][0],y = j+walk[k][1];//记录下一个坐标
//         int dir = k;//记录此时方向
//         if(x<1||x>n||y<1||y>n)continue;
        
//     }
// }
// int main()
// {
//     cin>>n;
//     for(int i =1;i<=n;i++)
//     {
//         for(int j =1;j<=n;j++)cin>>arr[i][j];
//     }

// }

//p2404
// 1.深度优先搜索
// int n;
// void dfs(int fir,int sum,string s)
// {
//     if(sum==n)
//     {
//         cout<<s<<endl;
//         return;//满足总和为n
//     }
//     //枚举剩下可能情况
//     for(int i = fir;i<=n-sum;i++)//获得字典顺序
//     {
//         if(i==n)continue;//考虑特殊情况
//         dfs(i,sum+i,s+(s.empty()?"":"+")+to_string(i));//直接跳过特殊首项
//     }

// }
// int main()
// {
//     cin>>n;
//     dfs(1,0,"");
// }


// 1.深度优先搜索
// 2.遍历所有,碰到‘w’,ans++
// 3.枚举八个方向

// char arr[102][102];
// int n,m,ans;
// int walk[8][2] = {{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};

// void dfs(int x,int y)
// {
//     arr[x][y] = '.';
//     //八个方向
//     for(int i =0;i<8;i++)
//     {
//         int ux = x+walk[i][0],uy = y+walk[i][1];
//         if(ux<1||uy<1||ux>n||uy>m||arr[ux][uy]=='.')continue;
//         dfs(ux,uy);//将剩下的‘w’都变成'.'
//     }
// }
// int main()
// {
//     cin>>n>>m;
//     for(int i =1;i<=n;i++)
//     {
//         for(int j =1;j<=m;j++)cin>>arr[i][j];
//     }
//     for(int i =1;i<=n;i++)
//     {
//         for(int j =1;j<=m;j++)
//         {
//             if(arr[i][j]=='W')
//             {
//                 ans++;
//                 dfs(i,j);
//             }
//         }
 
//     }
//     cout<<ans;
// }


//p1162
// int arr[102][102];
// int b[102][102];

// int n;
// int walk[4][2] = {{-1,0},{0,1},{1,0},{0,-1}};//四个方向

// void dfs(int x,int y)
// {
//     arr[x][y] = 1;//变成障碍
//     //枚举方向
//     for(int i =0;i<4;i++)
//     {
//         int ux = x+walk[i][0],uy = y+walk[i][1];
//         if(ux<0||uy<0||ux>n+1||uy>n+1||arr[ux][uy]!=0)continue;//确保下一个是0
//         dfs(ux,uy);
//     }
    
// }
// int main()
// {
//     cin>>n;
//     for(int i =1;i<=n;i++)
//     {
//         for(int j =1;j<=n;j++)
//         {   
//             cin>>arr[i][j];
//             b[i][j] = arr[i][j];
//         }
//     }
//     dfs(0,0);
//     for(int i =1;i<=n;i++)
//     {
//         for(int j =1;j<=n;j++)
//         {
//             if(arr[i][j]==0)
//             {
//                 b[i][j] = 2;
//             }
//         }
 
//     }
//     for(int i =1;i<=n;i++)
//     {
//         for(int j =1;j<=n;j++)
//         {
//             cout<<b[i][j]<<' ';
//         }
//         cout<<endl;
//     }
// }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这是一道模拟题,题目描述如下: 有 n 个猴子,按顺序编号为 1,2,3,…,n。这 n 只猴子按顺序围成一圈。从第 1 只猴子开始数,数到第 m 只猴子,把它踢出圈,剩下的猴子重新围成一圈,继续从第 1 只猴子开始数,直到只剩下一只猴子为止。问最后剩下的猴子编号是多少? 下面是解题思路: 首先,我们可以用一个数组来表示每只猴子,用一个变量表示当前轮到的猴子的编号。每次数到第 m 只猴子,就将它从数组中删除(将它对应的元素置为 0),同时更新当前轮到的猴子的编号。如果数组中只剩下一只猴子,就输出它的编号。 具体实现可以参考下面的代码(C++实现): ``` #include <iostream> using namespace std; const int maxn = 10000; int a[maxn]; // 存储猴子编号的数组 int main() { int n, m; cin >> n >> m; for (int i = 0; i < n; i++) { a[i] = i + 1; // 初始化猴子编号 } int cur = 0; // 当前轮到的猴子的编号 while (true) { int cnt = 0; // 当前轮已经数了几只猴子 for (int i = 0; i < n; i++) { if (a[i] != 0) { // 如果这只猴子还没被踢出圈 cnt++; if (cnt == m) { // 数到了第 m 只猴子 a[i] = 0; // 踢出圈 cnt = 0; // 重新开始计数 } if (a[i] != 0) { cur = i; // 更新当前轮到的猴子的编号 } } } int sum = 0; // 统计剩下的猴子数量 int last = 0; // 记录最后一只猴子的编号 for (int i = 0; i < n; i++) { if (a[i] != 0) { sum++; last = a[i]; } } if (sum == 1) { // 只剩下一只猴子了 cout << last << endl; // 输出它的编号 break; // 结束循环 } } return 0; } ``` 希望能够帮助你解决这道题目!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值