POJ1321-棋盘问题
POJ从23号崩了,放弃POJ(也不知是不是有比赛把oj都关了),各大OJ、洛谷、刷题网站、oj平台、oj平台、BZOJ挂了==>镜像、垃圾博客
Leetcode/PAT各种花里胡哨开会员能数据,它不配正经刷题
牛客网招聘多课程广告多我焦虑不想入
杭电oj:acm的必刷hdoj11页,但没啥专题,比较乱
洛谷不错,但偏向noi/noip/oier高中那些
UVA简直不是新手能玩的
找了找搜索算法的题目单,之前看过数一巨巨写的知乎:邝斌带你飞专题,决定刷这个。
无限回忆西安艾教培训,卿俊888上交知乎咨询,搞科技大把大把的花钱。克拉丽丝还是谁,亚洲区域赛上“这不是BZOJ原题吗”
A题目poj挂了找替代 → 百度找到aoj453即安徽大学ahuoj(没网址),搜到了氛围不错的不知道哪个学校的oj,但不对外开放,其他一堆叫AOJ的 → 无意间搜到不错的安徽大学B站集训队培训 → 必应搜到了可以用的 (好像是中学生用的oi竞赛网站)
妈的发现搜索引擎对编程越来愈不友好了,几年前还能搜到的东西现在啥都搜不到了,必应这样搜“控制台坐标系”才能搜到个,结果还tm收费傻逼东西,写的乱七八糟的,自己当初学的时候随便一搜就是好多解释坐标的,而且当时理解起来一点不费劲,看他写的我反而不会了。现在如果我是初学者去看这些讲坐标的文章我估计都学不会,根本就是两个思路没什么反不反的,简简单单的东西让他搞复杂了,不错的文章
这题上来就想n个for,写一半发现n未知,且本来就是二维数组哪来的n个for
正常DFS在这一步也走不了,类似于斜着走还有可能有隔几个棋盘不用摆放的情况,忍住好几次想看题解,
q神北师范同学校的51nod站长说想破脑袋,山理工首金牌金泽宇惊蛰雨说想1h,山理教练liuxiaofang?给了我名额,AA学姐梁L芝Z恩jinzeyu,q神两个号问,给了我个金牌路线,他的博客,指导岛娘的叉姐guxiaoxu说高中也有看答案不会的,岛娘邀请打CF,HIT省赛冠军futa扶她,数一巨巨人还挺帅健身选手,V8讲动归,计蒜客杯,百度之星,CCF/PAT/lanqiao大水赛,打多校,WYH给牛客网面试出算法题一个题1k,赚1w,那时候字节赞助acm比赛字节还不是有名公司,自动驾驶momenta火箭之星,楼教主男人八题pony.ai,一切都,╮(╯▽╰)╭哎
岛娘邀请我打CF
毕业那年美赛,联系老师,到处找,最后一步步有所眉目,无人知 一场空
邮学考研的种种
,想到唯一一个办法不太好写,思路:两个for确定一个点,然后更新新map(想了半天发现可以做标记遇到坐标是同一行列的跳过),k个棋子多少种去看k-1有多少种,k-1看k-2,最后摆1个棋子有多少种,看除了走过的有多少个可走的格子
1 #include<stdio.h> 2 #include<string.h> 3 int row[8]; 4 int column[8]; 5 char map[8][8];//绿色map 6 int n, k; 7 int main() 8 { 9 while(scanf("%d %d", &n, &k) && n != -1){// -1 0咋办 10 getchar();//特别注意一开始忘记了 11 for(int i=0;i<n;i++){ 12 for(int j=0;j<n;j++) 13 scanf("%c",&map[i][j]);//先把题目A了再去考虑char输入空格啥的 14 getchar();//根据回忆写的先不研究这个 15 } 16 // for(int i=0;i<n;i++){//验证字符输入map是否正确 17 // for(int j=0;j<n;j++) 18 // printf("%c",map[i][j]); 19 // printf("\n"); 20 // } 21 DFS(n,k); 22 } 23 } 24 int DFS(int k) 25 { 26 27 if(k==1) 28 return remain() 29 DFS(k) = DFS(k -1) + remain(k - 1); 30 } 31 int remain(int x)//放完x个棋子还有多少个可以放的空棋盘位置 32 { 33 // memset(row, 0, sizeof row); 34 // memset(column, 0, sizeof column); 35 for(int i=0;i<n;i++) 36 for(int j=0;j<n;j++){ 37 if(map[i][j] == '#' && !(row[i]+ column[j]) ){ 38 x++; 39 } 40 } 41 return x; 42 43 }
半拉可及写不出来,发现两个都是未知数,remain和DFS(k-1)
说是简单题,我这么弱了吗,几个for的暴力都想不出来
第一次WA
1 #include<stdio.h> 2 #include<string.h> 3 int row[8]; 4 int column[8];//列 5 char map[8][8];//绿色 6 //int vismap[8][8];//是否访问过,有行列就没必要有vismap了 7 int n, k; 8 int sum; 9 void DFS(int x,int y,int thisk); 10 int main() 11 { 12 while(scanf("%d %d", &n, &k) && n != -1){ 13 sum=0; 14 getchar(); 15 memset(column, 0,sizeof column); 16 memset(row, 0,sizeof row); 17 memset(map, 0,sizeof map); 18 // memset(vismap, 0,sizeof vismap); 19 for(int i=0;i<n;i++){ 20 for(int j=0;j<n;j++) 21 scanf("%c",&map[i][j]); 22 getchar(); 23 } 24 for(int i =0;i <n;i++) 25 for(int j=0;j<n;j++){ 26 if(map[i][j]=='#'){ 27 row[i]=1; 28 column[j]=1; 29 // vismap[i][j]=1; 30 DFS(i,j,1); 31 32 } 33 } 34 printf("%d\n", sum); 35 } 36 } 37 //#### 38 //##.# 39 //#.## 40 //##.# 41 void DFS(int x,int y,int thisk)//int k 会怎样 42 { 43 if(thisk == k){ 44 sum++; 45 // printf("@\n"); 46 return; 47 } 48 for(int i=x+1;i<n;i++) 49 for(int j=0;j<n;j++){ 50 if(map[i][j]=='#'&& row[i]==0&&column[j]==0){ 51 row[i]=1; 52 column[j]=1; 53 DFS(i,j,thisk+1); 54 row[i]=0; 55 column[j]=0; 56 } 57 } 58 } 59 //倒序,妈妈我想打这个比赛 60 //但是不管怎么样听妈妈说把最后的比赛考完好吗 61 //妈妈这辈子都没想过能住这么大房子,要是你爸还在得多高兴啊 62 //优盘逐渐正式图书馆→收藏 63 //看来他给拉过来了 不错,想发邮箱问是不是poj的服务器邮箱错误,发现现他们是个中学oj 64 65 66 //游戏 67 //腾讯前端NO.1 68 //艾教 69 //补课 70 //主刀姜涛不收钱 71 //夸克x浏览器程凯(我们支持你) 72 //人人网没版权都服务器都清空了 73 //这些我支持正义谁支持我 74 //放屁音乐网也没了 麻痹的“法律法规”“从香港卫士被封说起”截图
输入33
###
###
###
输出2
在if(thisk == k)这句话里加了个printf("@\n");发现只进去2次,说明main函数里DFS(i,j,1);完没回溯,比如(0,0)原点进去了0行0列不能走,那0行1列进去的时候,不回溯导致0行0列依旧不能走当然错了,正确是1行0列可以走,所以加上AC代码中的28 29两行就AC了
AC代码
1 #include<stdio.h> 2 #include<string.h> 3 int row[8]; 4 int column[8]; 5 char map[8][8]; 6 int n, k; 7 int sum; 8 void DFS(int x,int y,int thisk); 9 int main() 10 { 11 while(scanf("%d %d", &n, &k) && (n+k)!=-2){ 12 sum=0; 13 getchar(); 14 memset(column, 0,sizeof column); 15 memset(row, 0,sizeof row); 16 memset(map, 0,sizeof map); 17 for(int i=0;i<n;i++){ 18 for(int j=0;j<n;j++) 19 scanf("%c",&map[i][j]); 20 getchar(); 21 } 22 for(int i =0;i <n;i++) 23 for(int j=0;j<n;j++){ 24 if(map[i][j]=='#'){ 25 row[i]=1; 26 column[j]=1; 27 DFS(i,j,1); 28 row[i]=0; 29 column[j]=0; 30 } 31 } 32 printf("%d\n", sum); 33 } 34 } 35 void DFS(int x,int y,int thisk) 36 { 37 if(thisk == k){ 38 sum++; 39 return; 40 } 41 for(int i=x+1;i<n;i++) 42 for(int j=0;j<n;j++){ 43 if(map[i][j]=='#'&& row[i]==0&&column[j]==0){ 44 row[i]=1; 45 column[j]=1; 46 DFS(i,j,thisk+1); 47 row[i]=0; 48 column[j]=0; 49 } 50 } 51 }
10月份找到这个博客,发现可用平台也有这个题,复制代码也可以AC
强迫症思考的几个问题:
#while(scanf("%d %d", &n, &k) && (n+k)!=-2)这样可以,while(scanf("%d %d", &n, &k) && n!=-1)也可以,但while(scanf("%d %d", &n, &k) != EOF)会WA
#代码中char map[8][8];是绿色的,关键字map,尝试如下代码
1 #include <stdio.h> 2 int queue; 3 int main() 4 { 5 queue =1; 6 printf("%d\n",queue); 7 }
queue也是关键字也可以用int定义,这个跟之前的using std什么的了解个大概会用就行,具体学C++再说
#代码void DFS(int x, int y,int thisk)如果thisk是k会怎样?
1 #include<stdio.h> 2 int k; 3 void f(int k)//int k 会怎样 4 { 5 if(k == k) 6 k++; 7 printf("%d\n", k); 8 } 9 10 int main() 11 { 12 k=10; 13 f(k); 14 }
弱智问题,直接就恒等了啊
#其中浙大oj变成了pat了,成浙大陈越姥姥的了(考研的导师,知乎说我会简单算法是谦虚)zoj和zju什么的都没了,只有个商业化的pat