#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;
// }
// }
洛谷——《搜索》
最新推荐文章于 2024-07-13 13:36:16 发布