Fork me on GitHub

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 
毕业那年美赛,联系老师,到处找,最后一步步有所眉目,无人知 一场空 

邮学考研的种种
View Code

,想到唯一一个办法不太好写,思路:两个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 }
View Code

半拉可及写不出来,发现两个都是未知数,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 //放屁音乐网也没了 麻痹的“法律法规”“从香港卫士被封说起”截图
View Code

 

输入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 }
View Code

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 }
View Code

弱智问题,直接就恒等了啊

#其中浙大oj变成了pat了,成浙大陈越姥姥的了(考研的导师,知乎说我会简单算法是谦虚)zoj和zju什么的都没了,只有个商业化的pat

posted @ 2024-08-29 19:26  GerJCS  阅读(7)  评论(0编辑  收藏  举报