89分求改
查看原帖
89分求改
1088073
Axolotlwww楼主2025/2/1 03:33

下面有不带注释的版本,和测试的版本(有动画,大佬可以拿这个版本看呀)

这是提交记录

源码:

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

2025/2/1 03:33
加载中...