第四周周报:预备队训练-week4(bfs与dfs)

/*从起点开始往上下左右走尝试到达终点,每次到达终点roads++,最终返回roads*/
#include <bits/stdc++.h>
using namespace std;
int N,M,T,SX,SY,FX,FY,tem1,tem2,roads;
int vis[20][20];//最小边界是1
int X[]={1,0,-1,0};
int Y[]={0,1,0,-1};//表示右上左下四种走法
void dfs(int x,int y)
{
    if(x==FX&&y==FY)
    {
        roads++;
        return;//并非是结束函数,而是返回上一步
    }
    for(int i=0;i<4;i++)
    {
        int x1=x+X[i],y1=y+Y[i];//计算下一个点的坐标
        if((1<=x1&&x1<=N)&&(1<=y1&&y1<=M)&&vis[x1][y1]==0)//判断下一个点是否合法
        {
            vis[x1][y1]=1;
            dfs(x1,y1);
            vis[x1][y1]=0;
        }
    }
}
int main()
{
    cin>>N>>M>>T;
    cin>>SX>>SY>>FX>>FY;//起点终点坐标输入
    vis[SX][SY]=1;//起点标记为已走过
    for(int i=1;i<=T;i++)
    {
        cin>>tem1>>tem2;
        vis[tem1][tem2]=1;
    }
    dfs(SX,SY);
     cout<<roads;
}

/*从起点开始,每走一次就将能到达的区域标记,直到所有区域已经被标记或者说剩余位置无法到达*/
#include <bits/stdc++.h>
using namespace std;
struct Q
{
    int x,y;
}point,tem;//让栈能同时存入横纵坐标数据
int A[404][404],times,SX,SY,n,m,vis[404][404];

int X[]={1,1,-1,-1,2,2,-2,-2};
int Y[]={2,-2,2,-2,-1,1,1,-1};
queue<Q>q;
void bfs()
{
    while(!q.empty())
    {
        for(int i=0;i<8;i++)
        {
            int x1=q.front().x+X[i],y1=q.front().y+Y[i];//🐎的走法
            if((1<=x1&&n>=x1)&&(1<=y1&&m>=y1)&&vis[x1][y1]==0)//检查数据是否合法
            {
                //cout<<"x1="<<x1<<"  "<<"y1="<<y1<<endl;
                vis[x1][y1]=1;
                A[x1][y1]=A[q.front().x][q.front().y]+1;
                //cout<<"ANS="<<A[x1][y1]<<endl;
                tem.x=x1,tem.y=y1;
                q.push(tem);//点(q.front().x,q.front().y)将能达到的位置入栈            }
        }
        q.pop();//点(q.front().x,q.front().y)出栈
    }

}
int main()
{
    memset(A,-1,sizeof(A));将数组A的所有元素赋值为-1memset只能在main函数中使用
//用法memset(地址,值,赋值的区域字节大小)
    cin>>n>>m;
    cin>>SX>>SY;
    A[SX][SY]=0,vis[SX][SY]=1;
    point.x=SX,point.y=SY;
    q.push(point);
    bfs();
    A[SX][SY]=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(j!=1)cout<<setw(4)<<A[i][j];
            else cout<<A[i][j];
        }
        cout<<endl;
    }
}

/*思路:十六进制看作每一位上不超过16即可,如果某一位上的数字>=10,则将其转换为十六进制中对应的字母*/
#include<bits/stdc++.h>
using namespace std;
string R;
string A,B;
int a[10086000],b[10086000],c[10086000];
int main()
{
    cin>>A>>B;
    int L1=A.size();
    for(int i=1;i<=L1;i++)
    {
        if(A[L1-i]>='0'&&A[L1-i]<='9')a[i]=A[L1-i]-'0';//小于等于9的数字
        else a[i]=A[L1-i]-'A'+10;//字母转化为十进制数字
    }
   // for(int i=1;i<=L1;i++)cout<<a[i]<<"  ";
   // cout<<endl;
    int L2=B.size();
    for(int i=1;i<=L2;i++)
    {
        if(B[L2-i]>='0'&&B[L2-i]<='9')b[i]=B[L2-i]-'0';
        else b[i]=B[L2-i]-'A'+10;//俺的第一个错误,从上面复制代码的时候忘记把数组名从A改为B了
    }
   // for(int i=1;i<=L2;i++)cout<<b[i]<<"  ";
    //cout<<endl;
    for(int i=1;i<=L2;i++)
    {
        for(int j=1;j<=L1;j++){
            c[i+j-1]+=a[j]*b[i];//本位乘法
            c[i+j]+=c[i+j-1]/16;//进位
            c[i+j-1]%=16;//进位后的本位
        }
    }
    int L=L1+L2;
    for(int i=L;i>=1;i--)
    {
        if(c[i]==0)L--;
        if(c[i]!=0)break;//第二个错误,多统计了计算结果中0的个数,导致答案错误
    }
    for(int i=L;i>=1;i--)
    {
    if(c[i]>=10)cout<<(char)(c[i]-10+'A');
    else cout<<c[i];
        
    }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值