所有的ASCII码都可以用“\”加数字(一般是8进制数字)来表示。
而C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,
如\0,\t,\n等,就称为转义字符。因为后面的字符,都不是它本来的ASCII字符意思了。
所以,如果有关字符“\”的时候,通常用“\\”表示。
如【洛谷 p2243】电路维修 的代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<map>
#include<set>
#include<queue>
#include<deque> //双端队列
using namespace std;
const int MAXX=550;
int dis[MAXX][MAXX];
bool vis[MAXX][MAXX],Map[MAXX][MAXX];
int dx[4]={1,-1,1,-1};
int dy[4]={1,-1,-1,1}; //矩形中的边的扩展方向
char ss[MAXX];
int t,r,c;
inline bool checks(int x,int y){ //检查是否到边界
if(x>=1&&y>=1&&x<=r+1&&y<=c+1)
return true;
return false;
}
inline int edges(int x,int xx,int y,int yy){
if((xx<x&&yy<y)||(xx>x&&yy>y))
return !Map[min(x,xx)][min(y,yy)];
else return Map[min(x,xx)][min(y,yy)];
}
inline void bfs(){
Map[0][0]=1; //广搜起点
deque< pair < pair<int ,int> ,pair<int ,int > > >q; //二元组队列
pair<int ,int > u=make_pair(0,0); //原点连向(1,1)
pair<int ,int > v=make_pair(1,1);
q.push_back(make_pair(u,v)); //加入一条边(此时只有一条边,无论首尾)
dis[0][0]=0; //广搜起点
while(!q.empty()){ //↓↓取出队首
pair< pair<int ,int > , pair<int ,int > >k=q.front();
q.pop_front(); //扔出队首
pair<int ,int >u=k.first; //找出队首边的对应点
pair<int ,int >v=k.second; //u连向v
int xx=u.first; int yy=u.second; //表示两点的坐标
int x=v.first; int y=v.second;
if(vis[x][y]) continue; //记忆化剪枝(点)
dis[x][y]=dis[xx][yy]+edges(x,xx,y,yy);
vis[x][y]=1; //标记
for(int i=0;i<4;++i){
int xv=x+dx[i]; int yv=y+dy[i];
pair<int ,int >s=make_pair(xv,yv);
if(checks(xv,yv)&&!vis[xv][yv]){
if(edges(xv,x,yv,y)) q.push_back(make_pair(v,s));
else q.push_front(make_pair(v,s));
}
}
}
}
int main(){
scanf("%d",&t);
while(t--){
memset(dis,0,sizeof(dis)); //注意清零
memset(vis,0,sizeof(vis));
scanf("%d%d",&r,&c); //矩形长宽
for(int i=1;i<=r;++i){
scanf("%s",ss+1); //从字符串1号位开始存
for(int j=1;j<=c;++j)
if(ss[j]=='\\') Map[i][j]=1; //【!!!】注意"\"的使用
else Map[i][j]=0;
}
bfs();
if(vis[r+1][c+1]) printf("%d\n",dis[r+1][c+1]); //到达终点
else printf("NO SOLUTION\n");
}
return 0;
}
转义字符的意义:ASCII码值(十进制)
- \a:蜂鸣,响铃
- \b:回退:向后退一格
- \f:换页
- \n:换行,光标到下行行首
- \r:回车,光标到本行行首
- \t:水平制表
- \v:垂直制表
- \\:反斜杠
- \':单引号
- \":双引号
- \?:问号
- \ddd:三位八进制
- \xhh:二位十六进制
- \0:空字符(NULL),什么都不做
注:
1,\v垂直制表和\f换页符对屏幕没有任何影响,但会影响打印机执行响应操作。
2,\n其实应该叫回车换行。换行只是换一行,不改变光标的横坐标;
回车只是回到行首,不改变光标的纵坐标。
3,\t 光标向前移动四格或八格,可以在编译器里设置
4,\' 在字符里(即单引号里)使用。在字符串里(即双引号里)不需要,只要用 ' 即可。
5,\? 其实不必要。只要用 ? 就可以了(在windows VC6 和tc2 中验证)。
——时间划过风的轨迹,那个少年,还在等你。