ccpc女生赛I

#include<bits/stdc++.h>
using namespace std;
int n,m,len,l=0,v=0;
char g[55][55];
string s;
int main(){
	int x,y,tx,ty,f;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			cin>>g[i][j];
			if(g[i][j]=='*'){
				tx=i;ty=j;
			}
		}
	cin>>len;
	getchar();	
	getline(cin,s);
	for(int i=0;i<len;i++){
		if(s[i]=='L') l++;
		else if(s[i]=='R') l--;
		else if(s[i]=='U') v++;
		else v=max(v-1,0);
		l=(l+8)%8;
		f=0;
		if(l==1){
			for(int i=1;i<=v;i++){
				x=tx-1,y=ty-1;
				if(x<1||y<1) {
					f=1;break;
				}
				if(g[x][y]=='#'){
					f=1;break;
				}
				if(x>=1&&y>=1)//因为前面只判断了有一个越界跳出。这里要俩都不越界,访问数组才能成功 
					if(g[x][ty]=='#'&&g[tx][y]=='#'){
						f=1;break;
					}
				tx=x;ty=y;
			}	
		}
		else if(l==3){
			for(int i=1;i<=v;i++){
				x=tx+1,y=ty-1;
				if(x>n||y<1) {
					f=1;break;
				}
				if(g[x][y]=='#'){
					f=1;break;
				}
				if(x<=n&&y>=1)
					if(g[x][ty]=='#'&&g[tx][y]=='#'){
						f=1;break;
					}
				tx=x;ty=y;
			}
		}
		else if(l==5){
			for(int i=1;i<=v;i++){
				x=tx+1,y=ty+1;
				if(x>n||y>m) {
					f=1;break;
				}
				if(g[x][y]=='#'){
					f=1;break;
				}
				if(x<=n&&y<=m)
					if(g[x][ty]=='#'&&g[tx][y]=='#'){
						f=1;break;
					}
				tx=x;ty=y;
			}
		}
		else if(l==7){
			for(int i=1;i<=v;i++){
				x=tx-1,y=ty+1;
				if(x<1||y>m) {
					f=1;break;
				}
				if(g[x][y]=='#'){
					f=1;break;
				}
				if(x>=1&&y<=m)
					if(g[x][ty]=='#'&&g[tx][y]=='#'){
						f=1;break;
					}
				tx=x;ty=y;
			}
		}
		else if(l==0){
			for(int i=1;i<=v;i++){
				x=tx-1,y=ty;
				if(x<1) {
					f=1;break;
				}
				if(g[x][y]=='#'){
					f=1;break;
				}
				tx=x;ty=y;
			}
		}
		else if(l==2){
			for(int i=1;i<=v;i++){
				x=tx,y=ty-1;
				if(y<1) {
					f=1;break;
				}
				if(g[x][y]=='#'){
					f=1;break;
				}
				tx=x;ty=y;
			}
		}
		else if(l==4){
			for(int i=1;i<=v;i++){
				x=tx+1,y=ty;
				if(x>n) {
					f=1;break;
				}
				if(g[x][y]=='#'){
					f=1;break;
				}
				tx=x;ty=y;
			}
		}
		else if(l==6){
			for(int i=1;i<=v;i++){
				x=tx,y=ty+1;
				if(y>m) {
					f=1;break;
				}
				if(g[x][y]=='#'){
					f=1;break;
				}
				tx=x;ty=y;
			}
		}
		if(f){
			cout<<"Crash! ";
			v=0;
		}
		cout<<tx<<" "<<ty<<endl;
		//没碰撞也输出tx,ty。因为每走一步tx,ty都会更新 
		//调试的时候cout会卡住 走不到下一步,写printf比较好调 
	}
}
#include<bits/stdc++.h>
using namespace std;
int x,y,tx,ty,n,m,len,l=0,v=0,step;
int dx[8]={-1,-1,0,1,1,1,0,-1},dy[8]={0,-1,-1,-1,0,1,1,1};
char g[55][55];
string s;
void ff(){
	x=tx+dx[l],y=ty+dy[l];
	if(g[x][y]=='#'){
		v=0;step=0;cout<<"Crash! ";
	}
	else if(l%2&&g[tx][y]=='#'&&g[x][ty]=='#'){
		v=0;step=0;cout<<"Crash! ";
	}
	else {
		tx=x;ty=y;--step;
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			cin>>g[i][j];
			if(g[i][j]=='*'){
				tx=i;ty=j;
			}
		}
	for(int i=0;i<=n+1;i++){
		g[i][0]=g[i][m+1]='#';
	}
	for(int j=0;j<=m+1;j++){
		g[0][j]=g[n+1][j]='#';
	}
	cin>>len;
	getchar();	
	getline(cin,s);
	for(int i=0;i<len;i++){
		if(s[i]=='L') l++;
		else if(s[i]=='R') l--;
		else if(s[i]=='U') v++;
		else v=max(v-1,0);
		l=(l+8)%8;
		step=v;
		while(step) ff(); //实现整一条路的遍历 
//step随着这一路往后走不断减减,如果一路都没撞v不用变为0。所以不能直接调用v 
		printf("%d %d\n", tx, ty);
	}
}
#include<bits/stdc++.h>
using namespace std;
int x,y,tx,ty,n,m,len,l=0,v=0,step,a[55][55],g[55][55];
int dx[8]={-1,-1,0,1,1,1,0,-1},dy[8]={0,-1,-1,-1,0,1,1,1};
char c;
string s;
void ff(){
	if(g[tx][ty]&(1<<l)){
		v=0;step=0;cout<<"Crash! ";
	}
	else if(l%2&&(g[tx][ty]&(1<<(l+1)%8))&&(g[tx][ty]&(1<<(l+7)%8))){
		v=0;step=0;cout<<"Crash! ";
	}
	else {
		tx+=dx[l];ty+=dy[l];--step;
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			cin>>c;
			if(c=='*'){
				tx=i;ty=j;
				a[i][j]=0;
			}
			else if(c=='#') a[i][j]=1;//有障碍为1 
			else a[i][j]=0;
		}
	for(int i=0;i<=n+1;i++){
		a[i][0]=a[i][m+1]=1;
	}
	for(int j=0;j<=m+1;j++){
		a[0][j]=a[n+1][j]=1;
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			for(int k=0;k<8;k++){
				g[i][j]|=(a[i+dx[k]][j+dy[k]]<<k);
				//g[i][j]为8位二进制,第k个方向有障碍,则第k位为1 
			}
	cin>>len;
	getchar();	
	getline(cin,s);
	for(int i=0;i<len;i++){
		if(s[i]=='L') l++;
		else if(s[i]=='R') l--;
		else if(s[i]=='U') v++;
		else v=max(v-1,0);
		l=(l+8)%8;
		step=v;
		while(step) ff(); //实现整一条路的遍历 
//step随着这一路往后走不断减减,如果一路都没撞v不用变为0。所以不能直接调用v 
		printf("%d %d\n", tx, ty);
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_50904510/article/details/121297353