/*从起点开始往上下左右走尝试到达终点,每次到达终点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];
}
}