error
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
#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,假走完第一条路后,该标志不再有意义
//(走第一条路时辅助不走重复点),而第二条路就与第一条路不相干,重叠的点也可以大胆走 //,因为是在第二条路
#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;
}