第七周周报:第二次周赛题解

#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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值