#include<bits/stdc++.h>
using namespace std;
int n,A[10],B[10];//A
void dfs(int step)
{
if(step==n)//已经选择好数字
{
for(int i=0;i<n;i++)
{
cout<<B[i];
}
cout<<endl;
return;//回到上一步选择
}
for(int i=1;i<=n;i++)
{
if(A[i]==0)
{
B[step]=i;
A[i]=1;
dfs(step+1);
A[i]=0;
}
}
}
int main()
{
cin>>n;
dfs(0);
}
我的思路:从遍历地图,用bfs把“山”都遍历了,即bfs的次数就是山的个数
#include<bits/stdc++.h>
using namespace std;
int n,m,vis[2012][2012],MAP[2012][2012],ans;
int walk1[4]={0,1,0,-1};
int walk2[4]={1,0,-1,0};//上下左右四个方向
struct PS
{
int x,y;
};
queue<PS>Q;
void bfs( int x, int y)
{
if(vis[x][y])return ;
vis[x][y]=1;
PS tem={x,y};
Q.push(tem);
int x1=x,y1=y;
while(!Q.empty())
{
for(int i=0;i<4;i++)
{
x1=walk1[i]+Q.front().x;
y1=walk2[i]+Q.front().y;
if(MAP[x1][y1]==0||vis[x1][y1]==1)continue;
if(x1>=1&&x1<=m&&y1>=1&&y1<=n&&MAP[x1][y1]==1&&vis[x1][y1]==0)//只将山的部分入栈
{
vis[x1][y1]=1;
tem.x=x1,tem.y=y1;
Q.push (tem);
}
}
Q.pop();
}
ans++;//每次bfs,ans都会加1
}
int main()
{
cin>>m>>n;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
cin>>MAP[i][j];
}
}
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
if(vis[i][j]==1||MAP[i][j]==0)continue;//已走过或者不是所处位置不是山
bfs(i,j);
}
}
cout<<ans;
}
#include<bits/stdc++.h>
using namespace std;
int m[50086],start,M,ans;
int vis[50086];
int SX[2]={-1,1};
queue<int>Q;
bool bfs(int step)
{
vis[step]=1;
Q.push(step);
while(!Q.empty())
{
for(int i=0;i<2;i++)
{
int tem=Q.front()+m[Q.front()]*SX[i];//往前或者往后走
if(tem<=M&&tem>=1&&vis[tem]==0)
{
if(m[tem]==0)return 1;
Q.push(tem);
vis[tem]=1;
}
}
if(m[Q.front()]==0)return 1;
Q.pop();
}
return 0;
}
void dfs(int step)
{
if(m[step]==0)
{
ans++;
return;
}
for(int i=0;i<2;i++)
{
int tem1=step+m[step]*SX[i];//往前或者往后走
if(tem1>=0&&tem1<M)
if(vis[tem1]==0)
{
vis[tem1]=1;
dfs(tem1);
vis[tem1]=0;
}
}
return;
}
int main()
{
cin>>M;
for(int i=0;i<M;i++)//下标是从0开始的,我之前以为是从1开始的,导致改了很久
{
cin>>m[i];
}
cin>>start;
vis[start]=1;
dfs(start);
if(ans)cout<<"True";
else cout<<"False";
}
实属是给自己绕迷糊了,而且用多个if不知道为啥就是不转向
#include <bits/stdc++.h>
using namespace std;
int X[4]={-1,0,1,0},ans=1,flag,M,N;
int Y[4]={0,1,0,-1};
char MAP[505][505],Ans[4]={'U','R','D','L'};
int ANS[4];
int x,y;
int main()
{
cin>>N>>M;
for(int i=1;i<=N;i++)
{
for(int j=1;j<=M;j++)
{
cin>>MAP[i][j];
}
}
cin>>x>>y;//起始位置
for(int i=0;i<4;i++)
{
ans=1;
int x1=x, y1=y,type=i;//右下左上
//cout<<i<<endl;
while(1)
{
x1+=X[type];
y1+=Y[type];
if(x1==x&&y1==y&&type==i)
{
if(i==0)cout<<"U"<<endl;
if(i==1)cout<<"R"<<endl;
if(i==2)cout<<"D"<<endl;
if(i==3)cout<<"L"<<endl;
cout<<"COOL";
return 0;
}
if(x1>=1&&x1<=N&&y1>=1&&y1<=M&&MAP[x1][y1]!='C')
{
//cout<<"type="<<type<<endl;
//cout<<x1<<" "<<y1<<endl;
ans++;
}
else break;
if(MAP[x1][y1]=='/')
{
switch (type)
{
case 0:type=1;
break;
case 1:type=0;
break;
case 2:type=3;
break;
case 3:type=2;
break;
}
}
if(MAP[x1][y1]=='\\')//右=0,下=1,左=2,上=3
{
switch (type)
{
case 0:type=3;
break;
case 1:type=2;
break;
case 2:type=1;
break;
case 3:type=0;
break;
}
}
}
ANS[i]=ans;
}
int tem=0;
for(int i=0;i<4;i++)
{
if(ANS[tem]<ANS[i])tem=i;
}
cout<<Ans[tem]<<endl<<ANS[tem];
}
感谢水群带数学家们的奇思妙想
不管前四位数字是啥,都能有与之关于第五位数字对称形成的回文数
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b,c,ans;
cin>>a;
c=a%10000;//6~9位
b=a/10000;//1~5位
ans=b-10000;
int tem=0;
b/=10;
for(int i=0;i<4;i++)
{
tem=tem*10+b%10;
b/=10;
}
if(tem<=c)ans++;
cout<<ans;
}