下面有不带注释的版本,和测试的版本(有动画,大佬可以拿这个版本看呀)
源码:
#include<bits/stdc++.h>
//#include <windows.h>//仅调试用
using namespace std;
const int maxn=10+10;
string s[maxn];
int cd=3,cx,cy,fd=3,fx,fy,ans=0;//分别表示C和F的x坐标、y坐标和方向(0为右,1为下,2为左,3为上)
int nx[4]={0,1,0,-1};//移动时两个坐标的增量,与方向相匹配
int ny[4]={1,0,-1,0};
bool visc[maxn][maxn][4];//记录是否访问过
bool visf[maxn][maxn][4];//visf[x坐标][y坐标][方向],true为已访问
bool cm=false,fm=false;//cm为true则表示C已经到过曾经到过的地方,即路线陷入循环
//若C和F都以相同的方向访问过已访问的位置,且仍未相会判定为不会相遇
//检测在不在Map内
bool isInMap(int x,int y){
return 0<=x&&x<=9&&0<=y&&y<=9;
}
//更新vis状态
void upStua(int x,int y,int d,bool o){
if(o){
visc[x][y][d]=true;
s[x][y]=(char)(d+'0');
}
else{
visf[x][y][d]=true;
s[x][y]=(char)(d+'0'+4);
}
return;
}
//输出地图及参数,仅测试用
void priMap(){
cout<<endl;
for(int i=0;i<=9;i++){
cout<<s[i]<<endl;
}
printf("c(%d,%d,%d),f(%d,%d,%d),ans:%d\n",cx,cy,cd,fx,fy,fd,ans);
cout<<endl;
}
//行进一单位时间(C和F分别前进或转向一步
void tick(){
int ncx=cx,ncy=cy,nfx=fx,nfy=fy;
ncx+=nx[cd];
ncy+=ny[cd];
nfx+=nx[fd];
nfy+=ny[fd];
if(isInMap(ncx,ncy)&&s[ncx][ncy]!='*'){
cx=ncx;
cy=ncy;
if(visc[cx][cy][cd]) cm=true;
upStua(cx,cy,cd,1);
}
else{
cd=(cd+1)%4;
if(visc[cx][cy][cd]) cm=true;
upStua(cx,cy,cd,1);
}
if(isInMap(nfx,nfy)&&s[nfx][nfy]!='*'){
fx=nfx;
fy=nfy;
if(visf[fx][fy][fd]) fm=true;
upStua(fx,fy,fd,0);
}
else{
fd=(fd+1)%4;
if(visf[fx][fy][fd]) fm=true;
upStua(fx,fy,fd,0);
}
//priMap();
}
int main(){
memset(visc,0,sizeof(visc));
memset(visf,0,sizeof(visf));//初始化
for(int i=0;i<=9;i++)cin>>s[i];
for(int i=0;i<=9;i++){
for(int j=0;j<=9;j++){
if(s[i][j]=='F'){
fx=i;
fy=j;
s[i][j]='.';
}
if(s[i][j]=='C'){
cx=i;
cy=j;
s[i][j]='.';
}
}
}
while((cm!=true||fm!=true)&&(cx!=fx||cy!=fy)){
ans++;
tick();
//Sleep(200);//仅测试用
}
if(cm==true&&fm==true) cout<<0<<endl;
else cout<<ans;
return 0;
}
测试版本
#include<bits/stdc++.h>
#include <windows.h>
using namespace std;
const int maxn=10+10;
string s[maxn];
int cd=3,cx,cy,fd=3,fx,fy,ans=0;
int nx[4]={0,1,0,-1};
int ny[4]={1,0,-1,0};
bool visc[maxn][maxn][4];
bool visf[maxn][maxn][4];
bool cm=false,fm=false;
bool isInMap(int x,int y){
return 0<=x&&x<=9&&0<=y&&y<=9;
}
void upStua(int x,int y,int d,bool o){
if(o){
visc[x][y][d]=true;
s[x][y]=(char)(d+'0');
}
else{
visf[x][y][d]=true;
s[x][y]=(char)(d+'0'+4);
}
return;
}
void priMap(){
cout<<endl;
for(int i=0;i<=9;i++){
cout<<s[i]<<endl;
}
printf("c(%d,%d,%d),f(%d,%d,%d),ans:%d\n",cx,cy,cd,fx,fy,fd,ans);
cout<<endl;
}
void tick(){
int ncx=cx,ncy=cy,nfx=fx,nfy=fy;
ncx+=nx[cd];
ncy+=ny[cd];
nfx+=nx[fd];
nfy+=ny[fd];
if(isInMap(ncx,ncy)&&s[ncx][ncy]!='*'){
cx=ncx;
cy=ncy;
if(visc[cx][cy][cd]) cm=true;
upStua(cx,cy,cd,1);
}
else{
cd=(cd+1)%4;
if(visc[cx][cy][cd]) cm=true;
upStua(cx,cy,cd,1);
}
if(isInMap(nfx,nfy)&&s[nfx][nfy]!='*'){
fx=nfx;
fy=nfy;
if(visf[fx][fy][fd]) fm=true;
upStua(fx,fy,fd,0);
}
else{
fd=(fd+1)%4;
if(visf[fx][fy][fd]) fm=true;
upStua(fx,fy,fd,0);
}
priMap();
}
int main(){
memset(visc,0,sizeof(visc));
memset(visf,0,sizeof(visf));
for(int i=0;i<=9;i++)cin>>s[i];
for(int i=0;i<=9;i++){
for(int j=0;j<=9;j++){
if(s[i][j]=='F'){
fx=i;
fy=j;
s[i][j]='.';
}
if(s[i][j]=='C'){
cx=i;
cy=j;
s[i][j]='.';
}
}
}
while((cm!=true||fm!=true)&&(cx!=fx||cy!=fy)){
ans++;
tick();
Sleep(200);
}
if(cm==true&&fm==true) cout<<0<<endl;
else cout<<ans;
return 0;
}
/*
**********
**********
****C*****
**********
**********
**********
**********
****F*****
**********
**********
..........
.....*....
.....C....
.....F....
..........
..........
..........
..........
..........
..........
*/
不带注释
#include<bits/stdc++.h>
#include <windows.h>
using namespace std;
const int maxn=10+10;
string s[maxn];
int cd=3,cx,cy,fd=3,fx,fy,ans=0;
int nx[4]={0,1,0,-1};
int ny[4]={1,0,-1,0};
bool visc[maxn][maxn][4];
bool visf[maxn][maxn][4];
bool cm=false,fm=false;
bool isInMap(int x,int y){
return 0<=x&&x<=9&&0<=y&&y<=9;
}
void upStua(int x,int y,int d,bool o){
if(o){
visc[x][y][d]=true;
s[x][y]=(char)(d+'0');
}
else{
visf[x][y][d]=true;
s[x][y]=(char)(d+'0'+4);
}
return;
}
void priMap(){
cout<<endl;
for(int i=0;i<=9;i++){
cout<<s[i]<<endl;
}
printf("c(%d,%d,%d),f(%d,%d,%d),ans:%d\n",cx,cy,cd,fx,fy,fd,ans);
cout<<endl;
}
void tick(){
int ncx=cx,ncy=cy,nfx=fx,nfy=fy;
ncx+=nx[cd];
ncy+=ny[cd];
nfx+=nx[fd];
nfy+=ny[fd];
if(isInMap(ncx,ncy)&&s[ncx][ncy]!='*'){
cx=ncx;
cy=ncy;
if(visc[cx][cy][cd]) cm=true;
upStua(cx,cy,cd,1);
}
else{
cd=(cd+1)%4;
if(visc[cx][cy][cd]) cm=true;
upStua(cx,cy,cd,1);
}
if(isInMap(nfx,nfy)&&s[nfx][nfy]!='*'){
fx=nfx;
fy=nfy;
if(visf[fx][fy][fd]) fm=true;
upStua(fx,fy,fd,0);
}
else{
fd=(fd+1)%4;
if(visf[fx][fy][fd]) fm=true;
upStua(fx,fy,fd,0);
}
//priMap();
}
int main(){
memset(visc,0,sizeof(visc));
memset(visf,0,sizeof(visf));
for(int i=0;i<=9;i++)cin>>s[i];
for(int i=0;i<=9;i++){
for(int j=0;j<=9;j++){
if(s[i][j]=='F'){
fx=i;
fy=j;
s[i][j]='.';
}
if(s[i][j]=='C'){
cx=i;
cy=j;
s[i][j]='.';
}
}
}
while((cm!=true||fm!=true)&&(cx!=fx||cy!=fy)){
ans++;
tick();
//Sleep(200);
}
if(cm==true&&fm==true) cout<<0<<endl;
else cout<<ans;
return 0;
}