errors —>_—>错误糖果

error: reference to ‘left’ is ambiguous

原因:是和库中的变量名重复了
解决方法:修改变量名

Left √ left×

关于这种变量名导致的错误还有:

用 visited 代替 visit,visit当数组名直接compile error

用 cnt 代替 count

用 ssize 或者 area 代替 size 不用这么狠吧,哭哭哭~都让我撞到了 我惊了,你居然不长记性,size不允许噢!

报错:error: ‘int index‘ redeclared as different kind of symbol
c++的string中有一个函数就叫index,而我使用了万能头文件,包含了这个函数,命名冲突了!!

结论:慎用#include<bits/stdc++.h>

报错:[Error] ‘int y1’ redeclared as different kind of symbol 显示变量
y1 和 C++ 标准库中的某个变量名称冲突,这个问题应当引起注意。 声明全局变量 int x1,y1,x2,y2; 另外这不是头文件写成 <bits/stdc++.h> 引起的,即使换成各具体的头文件(, ,
)还是会发生这个错误。 具体原因及解决办法还有待研究。

[Error] switch quantity not an integer

switch括号内的数据只能是整型(或字符表达式)。
看这里

运行结果出现@这种乱码,请考虑数组越界,检查边界判断条件

多半是因为数组越界,检查for循环的终止判断条件,检查搜索时对于是否超过边界的判断条件,尤其注意0和1
1490:A Knight’s Journey
这题就是因为 cx>=1&&……cy>=0而找了很久

#include <bits/stdc++.h>		
using namespace std;
//#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
int p,q; 
int area;
int flag=0;
//int dx[]={} 
//int dy[]={} 
const int N=30;
int vis[N][N];
//int dw[8][2]={{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2}};
int dw[8][2]={{-1,-2},{1,-2},{-2,-1},{2,-1},{-2,1},{2,1},{-1,2},{1,2}};
struct kkk{
	int x;
	int y;
};
kkk w[N*N]; 
void dfs(int x,int y,int step){
	if(flag==1)return; //已经成功踏遍,可能有的点还没机会也没必要遍历八方啦 
	w[step].x=x;
	w[step].y=y;
	if(step==area){
		flag=1;
		return;
	}
	for(int i=0;i<8;i++){
		int cx=x+dw[i][0];
		int cy=y+dw[i][1];
		if((cx>=1)&&(cx<=p)&&(cy>=1)&&(cy<=q)){
			if(vis[cx][cy]==0){
			vis[cx][cy]=1;
			dfs(cx,cy,step+1); 
			vis[cx][cy]=0;
			}
		}
	}
}
int main(){
	int t;
	scanf("%d",&t);
	for(int i=1;i<=t;i++){
//		cin>>p>>q;//表示棋盘有p行q列 
		scanf("%d %d",&p,&q);
		memset(vis,0,sizeof(vis));
		vis[1][1]=1;//从位置1,1出发嘛,从此只看八方位置 
		flag=0;//从1,1开始深度搜索,每个点遍历八方之后看能否踏遍所有位置 
		area=p*q;
		dfs(1,1,1);//step代表踏过的步数啦=走动步数加上最开始的1 
		printf("Scenario #%d:\n",i);
		if(flag==1){//要输出走过的那些点,因此还要记录走过的点坐标 
			for(int j=1;j<=area;j++){
				printf("%c%d",w[j].y+'A'-1,w[j].x);
			}
			printf("\n");
		} 
		else {
			printf("impossible\n");
		}
			printf("\n");
	}
    return 0;
}
//这题面还挺讨厌的。。。
//lie用英文字母表示,行用阿拉伯数字表示,走的规则是象棋里的 马走日 ,
//目的是看能否踏遍给定尺寸棋盘每个点 
//哦凑,自诩英文不错,这道题真的搞蒙我了,从题目压根没看出行列到底哪个是用英文字母表示
//大概,列是用字母表示,按照字典序就是列要优先地小
//int dx[8]={-2,-2,-1,-1,1,1,2,2};
//int dy[8]={-1,1,-2,2,-2,2,-1,1};
//最后输出坐标还是先列后行 shirt! 

标记是否访问过的visited数组假访问探测后要将visited数组元素重置为0

4982:踩方格

#include <bits/stdc++.h>		
using namespace std;
//const int N =1e5+5;
int visited[30][50];
//矩阵边界无穷远,但顶多向上走20步,顶多向左或右走20步,这样一来行动范围就限制在了 
int ways(int x,int y,int n){
	if(n==0)return 1;
	visited[x][y]=1;//访问过了这个格子,塌了
	int w=0; 
	if(!visited[x+1][y]) w+=ways(x+1,y,n-1);//向上走
	if(!visited[x][y-1]) w+=ways(x,y-1,n-1);//向Zuo走
	if(!visited[x][y+1]) w+=ways(x,y+1,n-1);//向you走
	visited[x][y]=0;//!!!!! 
//测试案例 2输出7 正确是因为允许走两步那么只能朝一个方向走,不存在走多步
//	站在(x,y)这点还能走m步 能走的路径条数怎么求?	路径条数==
//假设下一步向上走,在(x+1,y)这点还能走m-1步的路径条数 +
//假设下一步向左走,在(x,y-1)这点还能走m-1步的路径条数+
//假设下一步向右走,在(x,y+1)这点还能走m-1步的路径条数
//试想加完向上走后的路径条数之后,这途中走过的点都 visited[x][y]=1 塌了
//但是向左走的路径中不免会走到上次走过的点,且算在不同路径中,如果算完向上走的就榻
//那么无法计量向左(右)走的路径条数 
//也许对于代码的解释就是:一个递归函数中调用了多次该递归函数,相当于每次到路口
//都有三条路,visited数组是为了在一条路中不走重复的点,但是三条路中有重叠的点,
//在走第一条路时走过一个点就置为1,假走完第一条路后,该标志不再有意义
//(走第一条路时辅助不走重复点),而第二条路就与第一条路不相干,重叠的点也可以大胆走
//,因为是在第二条路 
 
	return w;
}
int main(){
	int n;
	cin>>n;
	memset(visited,0,sizeof(visited));
//	cout<<ways(0,25,n);
//--------------------------------------------
//	int l[n];int r[n];int u[n];
//	l[1]=1;r[1]=1;u[1]=1;
//	for(int i=2;i<=n;i++){
//		l[i]=l[i-1]+u[i-1];//走i步先向左走情况接下来只能是向左或向上 不可能向右 
//		r[i]=r[i-1]+u[i-1];
//		u[i]=l[i-1]+r[i-1]+u[i-1];
//	}
//	cout<<l[n]+r[n]+u[n];
//------------------------------------------
	int w[n];
	w[1]=3;//走一步有3种走法
	w[0]=1;
	for(int i=2;i<=n;i++){
		w[i]=w[i-1]*2+w[i-2];//向左走一部之后和向右走一部之后+向上走一步之后 
	} 
	cout<<w[n]; 
    return 0;
}
//法一:递归,语法上不甚好,但为可走的范围划分区域开数组的思维值得学习
//法二:称不上 动态规划 吧 

visited[x][y]=0;//!!! //测试案例 2输出7 正确是因为允许走两步那么只能朝一个方向走,不存在走多步
// 站在(x,y)这点还能走m步 能走的路径条数怎么求? 路径条数== //假设下一步向上走,在(x+1,y)这点还能走m-1步的路径条数

  • //假设下一步向左走,在(x,y-1)这点还能走m-1步的路径条数+ //假设下一步向右走,在(x,y+1)这点还能走m-1步的路径条数 //试想加完向上走后的路径条数之后,这途中走过的点都 visited[x][y]=1 塌了
    //但是向左走的路径中不免会走到上次走过的点,且算在不同路径中,如果算完向上走的就榻 //那么无法计量向左(右)走的路径条数
    //也许对于代码的解释就是:一个递归函数中调用了多次该递归函数,相当于每次到路口
    //都有三条路,visited数组是为了在一条路中不走重复的点,但是三条路中有重叠的点,
    //在走第一条路时走过一个点就置为1,假走完第一条路后,该标志不再有意义
    //(走第一条路时辅助不走重复点),而第二条路就与第一条路不相干,重叠的点也可以大胆走 //,因为是在第二条路

1817:城堡问题

#include <bits/stdc++.h>		
using namespace std;
int a[60][60];
int visited[60][60];
int ssize=0;//记录每个房子的容量,每进入一个新的房子 的房间联通数量 
void dfs(int m,int n){
	if(visited[m][n])return ;
	ssize++;
	visited[m][n]=1;//这个走完递归的一条路就不用再置回0啦,
//	因为三条路是求同一个房子的 最大联通房间数量,不能算如重复的房间
// 三条路(有重叠的可访问点)允许访问同样的点 走完一条路之后才要置回0 
	if((a[m][n]&1)==0){//西边没有墙 
		dfs(m,n-1) ;
	}
	if((a[m][n]&2)==0){//北边没有墙 
	dfs(m-1,n) ;
	}
	if((a[m][n]&4)==0){//东边没有墙 
	dfs(m,n+1) ;
}
	if((a[m][n]&8)==0){//南边没有墙 
	dfs(m+1,n) ;
}
} 
int main(){
	int m,n;
	cin>>m>>n;
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			cin>>a[i][j];
		}
	}
	memset(visited,0,sizeof(visited));
	int num=0,msize=0;//房间数,最大的房间容量 
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			if(!visited[i][j]){
				ssize=0;
				num++;
				dfs(i,j);
				msize=max(msize,ssize);
			}
		}
	}
	cout<<num<<endl<<msize;
    return 0;
}

回味一下这两题,
都可以体会一把是否要将visited数组重置为0,
还有你心中的那个坐标系-------->y, 第一题用的右上方,第二题用的第四象限

变量名和数组名重复定义

报错[Error] invalid types ‘int[int]‘ for array subscript原因及解决方案

优先级啊,&&>||,还记得 !飞哥第一

#include <bits/stdc++.h>		
using namespace std;
int main(){
	int t;
	cin>>t;
	int n;
	while(t--){
	cin>>n;
	int cnt=0;
	//可以先判断if(n%25==0)噢,省下一些时间,当然不提前判断也许行 
	int flag0=0;//找到了最后两位中的那个0,还要找个0或者5 
	int flag5=0;//找到了最后两位中的那个5,还要找个2或者7
	while(n){
//		int x=n%10;
//		if(x==0&&!flag0)flag0=1;
//		else if(x==5&&!flag5)flag5=1;
//		else if(x==0||x==5&&flag0)break;
//		else if(x==2||x==7&&flag5)break;
//		else{
//			cnt++;
//		} 
//		n/=10;
//这种对于每个数字起初态度都是留下的做法不可以,比如50555,留下了最后一个5,走着走着
//就会让你悔不当初,还是狠一点,一开始就否掉它,走到成立的那一步再捞回来 
		cnt++;
		int x=n%10;
//	 	if(x==0&&!flag0)flag0=1;
//		else if(x==5&&!flag5)flag5=1;
//榆木脑袋怎么可以放在前面呢,flag标志一设,那么单单一个0或2、5、7就过关了呀 
		if((x==0||x==5)&&flag0){
//!!!||和 && 优先级可不像你想的那样相同 然后按照先后顺序判断,会先判断&&噢 !!! 
			cnt-=2;//捞回这两个可以放在末尾的数 
			break;
		}
		else if((x==2||x==7)&&flag5){
			cnt-=2; 
			break;
		}
		if(x==0&&!flag0)flag0=1;
		else if(x==5&&!flag5)flag5=1;
		n/=10;
	}
	cout<<cnt<<endl;
	}
    return 0;
}

1817:城堡问题
球球了,打个括号吧?不知道怎么骂自己好

#include <bits/stdc++.h>		
using namespace std;
int a[60][60];
int visited[60][60];
int ssize=0;//记录每个房子的容量,每进入一个新的房子 的房间联通数量 
void dfs(int m,int n){
	if(visited[m][n])return ;
	ssize++;
	visited[m][n]=1;//这个走完递归的一条路就不用再置回0啦,
//	因为三条路是求同一个房子的 最大联通房间数量,不能算如重复的房间
// 三条路(有重叠的可访问点)允许访问同样的点 走完一条路之后才要置回0 
	if((a[m][n]&1)==0){//西边没有墙 
		dfs(m,n-1) ;
	}
	if((a[m][n]&2)==0){//北边没有墙 
	dfs(m-1,n) ;
	}
	if((a[m][n]&4)==0){//东边没有墙 
	dfs(m,n+1) ;
}
	if((a[m][n]&8)==0){//南边没有墙 
	dfs(m+1,n) ;
}
} 
int main(){
	int m,n;
	cin>>m>>n;
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			cin>>a[i][j];
		}
	}
	memset(visited,0,sizeof(visited));
	int num=0,msize=0;//房间数,最大的房间容量 
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			if(!visited[i][j]){
				ssize=0;
				num++;
				dfs(i,j);
				msize=max(msize,ssize);
			}
		}
	}
	cout<<num<<endl<<msize;
    return 0;
}

数组的行列 混杂 坐标系的一地鸡毛

在这里插入图片描述

#include <bits/stdc++.h>		
using namespace std;
//typedef long long int ll;
int dx[3]={0,1,-1};
int dy[3]={1,1,1};//不后退 
int main(){
	int t;
	cin>>t;
	while(t--){
		int n;
		cin>>n;
		int a[2][n];
		for(int i=0;i<2;i++){
			for(int j=0;j<n;j++){
				cin>>a[i][j];
			}
		}
		int x=0;
		int y=0;
		while(true){
//			cout<<"niaho"<<endl;
			int flag=0;
			for(int k=0;k<3;k++){
			int cx=dx[k]+x;
			 int cy=dy[k]+y;
			 if(cx>=0&&cx<2&&cy>=0&&cy<n&&a[cx][cy]==1){
			 	x=cx;
			 	y=cy;
			 	flag=1;
			 	break;
			 }
		}
		if(y==n-1){
		cout<<"er_sz yyds"<<endl;
		break;
		}
		else if(flag==0){
		cout<<"so sad"<<endl;
		break;		
		}
	}	
	}
    return 0;
}

读对于数组,a[i][j] 是 i 行 j 列,i表示第 i 行,由于之前这十几年对于坐标系纵轴为y的定势思维,很容易将 j去代表行。再加上dx【i】的方向向量,思绪真的鸡毛飞满天了
怎么保证自己清醒呢?心中要有坐标轴焊在那儿,
在这里插入图片描述
这样一来就和谐了,对于二维数组,第一个参数表示行,又符合x在前,dx【i】就是沿着x轴方向的变化

拿循环变量直接去操作,死循环有

#include <bits/stdc++.h>		
using namespace std;
int main(){
	int t;
	cin>>t;
	int n;
	while(t--){
		cin>>n;
		int cnt=0;
		for(int i=1;i<=n;i++){
//			if(i/10==0)cnt++;
//			while((i/10)!=0){//88 89 100 12 11
//			cout<<"niew "<<i;
//				int x=(i/10)%10;
//				if(i%10==x)i=i/10;
//				else {
//					break;
//				}
//			}
			int k=i;
			int x=k%10;
			while(k!=0){//6
		
				if(k%10==x)	{
					k=k/10;
				}
				else break;
			}
			if(k==0)cnt++;
		}
		cout<<cnt<<endl;
	}
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值