算法分析与设计 西工大 noj 第二次实验

Problem A 0-1背包问题

时限:1000ms 内存限制:10000K 总时限:3000ms

描述:

需对容量为c 的背包进行装载。从n 个物品中选取装入背包的物品,每件物品i 的重量为wi ,价值为pi 。对于可行的背包装载,背包中物品的总重量不能超过背包的容量,最佳装载是指所装入的物品价值最高。

输入:

多个测例,每个测例的输入占三行。第一行两个整数:n(n<=10)和c,第二行n个整数分别是w1到wn,第三行n个整数分别是p1到pn。
n 和 c 都等于零标志输入结束。

输出:

每个测例的输出占一行,输出一个整数,即最佳装载的总价值。

输入样例:

1 2
1
1
2 3
2 2
3 4
0 0

输出样例:

1
4

这是一道典型的01背包。由于n十分小,所以可以采用暴力搜索,也可以采用DP。

其实严格意义上我完全可以把物品的价值搞成1e9,这样就不可以使用DP了,但是数据十分水,也就过去了。

标准解法是暴力

#include <iostream>
#include <cstdio>
using namespace std;
#define N 20
int n, m;
int w[N], v[N];
int ans = 0;
inline int max(int x, int y)
{return x > y ? x : y;
}
void dfs(int x, int sw, int sv)
{if(x > n) {ans = max(ans, sw);return;}dfs(x+1, sw, sv);if(sv + v[x] <= m){dfs(x+1, sw + w[x], sv+v[x]);}
}
int main()
{while(scanf("%d%d", &n, &m), n||m){ans = 0;for(int i = 1; i <= n; i++) scanf("%d", v+i);for(int i = 1; i <= n; i++) scanf("%d", w+i);dfs(1, 0, 0);printf("%d\n", ans);}return 0;
}

Problem B 装载问题

时限:1000ms 内存限制:10000K 总时限:3000ms

描述:

有两艘船,载重量分别是c1、 c2,n个集装箱,重量是wi (i=1…n),且所有集装箱的总重量不超过c1+c2。确定是否有可能将所有集装箱全部装入两艘船。

输入:

多个测例,每个测例的输入占两行。第一行一次是c1、c2和n(n<=10);第二行n个整数表示wi (i=1…n)。n等于0标志输入结束。

输出:

对于每个测例在单独的一行内输出Yes或No。

输入样例:

7 8 2
8 7
7 9 2
8 8
0 0 0

输出样例:

Yes
No

其实本质上还是一道背包问题。

把第一个小船当成背包,在不超载的前提下放置尽可能重的物品,以便于为第二艘小船留下余地。

#include<iostream>
#include<cstdio>
using namespace std;
#define N 20
int c1, c2, n;
int w[N];
int sum;
bool flag = false;
void dfs(int x, int s)
{if(x > n){if(s <= c1 && (sum - s) <= c2) flag = true;return ;}dfs(x+1, s);dfs(x+1, s+w[x]);
}
int main()
{while(scanf("%d%d%d", &c1, &c2, &n), n){flag = false;sum = 0;for(int i = 1; i <= n; i++) scanf("%d", w+i);for(int i = 1; i <= n; i++) sum += w[i];dfs(1, 0);if(flag){puts("Yes");}else{puts("No");}}return 0;
}

Problem C 堡垒问题

时限:1000ms 内存限制:10000K 总时限:3000ms

描述:

城堡是一个4×4的方格,为了保卫城堡,现需要在某些格子里修建一些堡垒。城堡中的某些格子是墙,其余格子都是空格,堡垒只能建在空格里,每个堡垒都可以向上下左右四个方向射击,如果两个堡垒在同一行或同一列,且中间没有墙相隔,则两个堡垒都会把对方打掉。问对于给定的一种状态,最多能够修建几个堡垒。

输入:

每个测例以一个整数n(1<=n<=4)开始,表示城堡的大小。接下来是n行字符每行n个,‘X’表示该位置是墙,‘.’表示该位置是空格。n等于0标志输入结束。

输出:

每个测例在单独的一行输出一个整数:最多修建堡垒的个数。

输入样例:

4
.X..
....
XX..
....
2
XX
.X
3
.X.
X.X
.X.
3
...
.XX
.XX
4
....
....
....
....
0

输出样例:

5
1
5
2
4
#include <cstdio>
#include <cstdlib>
using namespace std;
#define N 6
char a[N][N];
int n;
int ans = 0;
inline void get(int val, int &x, int &y)
{x = val/n;y = val%n;
}
bool ck(int x, int y)
{for(int i = x+1; i < n; i++){if(a[i][y] == 'o') return 0;else if(a[i][y] == 'X') break;}for(int i = x-1; i >= 0; i--){if(a[i][y] == 'o') return 0;else if(a[i][y] == 'X') break;}for(int i = y+1; i< n; i++){if(a[x][i] == 'o') return 0;else if(a[x][i] == 'X') break;}for(int i = y-1; i >= 0; i--){if(a[x][i] == 'o') return 0;else if(a[x][i] == 'X') break;}return true;
}
void dfs(int p, int s)
{if(p >= n*n){if(s > ans) ans = s;//DEBUG/*if(s == 4){for(int i = 0; i < 4; i++){for(int j = 0; j < 4; j++){printf("%c", a[i][j]);}puts("");}puts("");}*///ENDDEBUGreturn ;}dfs(p+1, s);int x, y;get(p, x, y);if(ck(x, y) && a[x][y] == '.'){a[x][y] = 'o';dfs(p+1, s+1);a[x][y] = '.';}
}
int main()
{while(scanf("%d", &n), n){for(int i = 0; i < n; i++) scanf("%s", a[i]);ans = 0;dfs(0, 0);printf("%d\n", ans);}// n = 4;// for(int i = 0; i < 16; i++)// {//     int x, y;;//     get(i, x, y);//     printf("(%d, %d)  ", x, y);// }}

Problem D 8皇后问题

时限:1000ms 内存限制:10000K 总时限:3000ms

描述:

输出8皇后问题所有结果。

输入:

没有输入。

输出:

每个结果第一行是No n:的形式,n表示输出的是第几个结果;下面8行,每行8个字符,‘A’表示皇后,‘.’表示空格。不同的结果中,先输出第一个皇后位置靠前的结果;第一个皇后位置相同,先输出第二个皇后位置靠前的结果;依次类推。

输入样例:

输出样例:

输出的前几行:
No 1:
A.......
....A...
.......A
.....A..
..A.....
......A.
.A......
...A....
No 2:
A.......
.....A..
.......A
..A.....
......A.
...A....
.A......
....A...

这一道题目所使用的数据结构十分巧妙,由于每一行仅仅只可以有一个皇后,所以采用一维数组就可以。

注意时时刻刻想着剪枝。

判断对角线的方法是:abs(stac[i] - val) == abs(i-row)

#include <cstdio>
#include <algorithm>
#include <cstdlib>
using namespace std;
#define N 12
int stac[N];
int cnt = 0;
bool ck(int row, int val)
{for(int i = 1; i <= 8; i++){if(stac[i] == 0 || i == row) continue;if(stac[i] == val || abs(stac[i] - val) == abs(i-row)) return false;}return true;
}
inline void Print(int x)
{for(int i = 1; i < x; i++) putchar('.');putchar('A');for(int i = x+1; i <= 8; i++) putchar('.');puts("");
}
void dfs(int x)
{if(x > 8){printf("No %d:\n", ++cnt);for(int i = 1; i <= 8; i++){Print(stac[i]);}return;// for(int i = 1; i <= 8; i++) printf("%d ", stac[i]);//balabala//return ;//DEBUG// exit(0);}for(int i = 1; i <= 8; i++){if(ck(x, i)) {stac[x] = i;dfs(x+1);stac[x] = 0;}}
}
int main()
{dfs(1);return 0;
}

Problem E 素数环问题

时限:1000ms 内存限制:10000K 总时限:3000ms

描述:

把1到20这重新排列,使得排列后的序列A满足:
a. 任意相邻两个数之和是素数
b. 不存在满足条件a的序列B使得:A和B的前k(0 <= k <= 19)项相同且B的第k+1项比A的第k+1项小。(即按字典序排列的第一项)

输入:

没有输入。

输出:

输出A,两个数字之间用一个空格隔开,第一个数字前面和最后一个数字后面没有空格。

输入样例:

输出样例:

标准解法

如果要是要求输出所有的素数环,那么就应该采用求全排列+剪枝+判断字典序

贪心解法

但是可以使用贪心来做。从前往后先试1,然后再试2…如果找到满足条件的环,就直接输出。

打表解法

这么小的数据量,直接人脑使用贪心法进行计算,来一个puts("")

//采取贪心的思想,从小到大选择
#include <cstdio>
#include <cstdlib>
using namespace std;
#define N 25
bool v[N];
int stac[N];
bool prim[40];
void dfs(int x)
{if(x > 20){for(int i = 1; i <= 20; i++) {if(i != 20)printf("%d ", stac[i]);else printf("%d", stac[20]);}puts("");exit(0);}for(int i = 1; i <= 20; i++){if(!v[i] && (x == 1 || x < 20 && x > 1 && (prim[stac[x-1] + i]) ||(x == 20 && (prim[stac[1] + i])))){stac[x] = i;v[i] = 1;dfs(x+1);v[i] = 0;stac[x] = 0;}}
}
int main()
{   for(int i = 2; i <= 45; i++){bool flag = true;for(int j = 2; j*j <= i; j++) if(i % j == 0){flag = false;break;}if(!flag) prim[i] = 0;else prim[i] = 1;}dfs(1);// for(int i = 1; i <= 45; i++) if(prim[i])//     printf("%d ", i);return 0;
}

Problem F 迷宫问题

时限:1000ms 内存限制:10000K 总时限:3000ms

描述:

给一个20×20的迷宫、起点坐标和终点坐标,问从起点是否能到达终点。

输入:

多个测例。输入的第一行是一个整数n,表示测例的个数。接下来是n个测例,每个测例占21行,第一行四个整数x1,y1,x2,y2是起止点的位置(坐标从零开始),(x1,y1)是起点,(x2,y2)是终点。下面20行每行20个字符,’.’表示空格;’X’表示墙。

输出:

每个测例的输出占一行,输出Yes或No。

输入样例:

2
0 0 19 19
....................
XXXXXXXXXXXXXXXXXXXX
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
....................
0 0 19 19
....................
XXXXXXXXXXXXXXXXXXX.
....................
.XXXXXXXXXXXXXXXXXXX
....................
XXXXXXXXXXXXXXXXXXX.
....................
.XXXXXXXXXXXXXXXXXXX
....................
XXXXXXXXXXXXXXXXXXX.
....................
.XXXXXXXXXXXXXXXXXXX
....................
XXXXXXXXXXXXXXXXXXX.
XXXXXXXXXXXXXXXXXXX.
XXXXXXXXXXXXXXXXXXX.
XXXXXXXXXXXXXXXXXXX.
....................
.XXXXXXXXXXXXXXXXXXX
....................

输出样例:

No
Yes

直接进行DFS图的遍历

#include <iostream>
#include <cstdio>using namespace std;
#define N 30
pair<int, int> s, t;
char a[N][N];
bool v[N][N];
const int n = 20;
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
inline bool ck(int x, int y)
{if(x < 0 || x >= n || y < 0 || y >= n) return false;if(v[x][y]) return false;if(a[x][y] == 'X') return false;return true;
}
bool dfs(int nx, int ny)
{if(nx == t.first && ny == t.second){return 1;}for(int k = 0; k < 4; k++){int x = nx + dx[k];int y = ny + dy[k];if(ck(x, y)){v[x][y] = 1;if(dfs(x, y)) return 1;}}return 0;
}
int main()
{int T;cin >> T;while(T--){for(int i = 0; i <= 20; i++)for(int j = 0; j <= 20; j++)v[i][j] = false;scanf("%d%d%d%d", &s.first, &s.second, &t.first, &t.second);for(int i = 0; i < n; i++) scanf("%s", a[i]);if(dfs(s.first, s.second)){puts("Yes");}else{puts("No");}}return 0;
}

Problem G 踩气球

时限:1000ms 内存限制:10000K 总时限:3000ms

描述:

六一儿童节,小朋友们做踩气球游戏,气球的编号是1~100,两位小朋友各踩了一些气球,要求他们报出自己所踩气球的编号的乘积。现在需要你编一个程序来判断他们的胜负,判断的规则是这样的:如果两人都说了真话,数字大的人赢;如果两人都说了假话,数字大的人赢;如果报小数字的人说的是真话而报大数字的人说谎,则报小数字的人赢(注意:只要所报的小数字是有可能的,即认为此人说了真话)。

输入:

输入为两个数字,0 0表示结束;

输出:

输出为获胜的数字。

输入样例:

36 62
49 343
0 0

输出样例:

62
49

这一道题目使我畏惧,真的是太太太离谱了!

暴力搜索法:

虽然看起来有很多情况,但是由于int范围内的相乘大于int的数字其实并没有多少,所以也还可以

#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
int small, big;//大的数字以及小的数字
int mul1, mul2;//已经当前已经踩过的气球的乘积
bool f1, f2;//记录说的是不是真话void dfs(int k)
{if(k <= 1){if(mul1 == small && mul2 == big) {f1 = 1, f2 = 1;}else if( (!f1 || !f2) && mul1 == small ){f1 = 1, f2 = 0;}else if(!f1&&!f2&&mul2 == big){f1 = 0, f2 = 1;}return ;}if(mul1*k <= small && small % k == 0){mul1 *= k;dfs(k-1);mul2 /= k;}if(mul2 * k <= big && big % k == 0){mul2 *= k;dfs(k-1);mul2 /= k;}dfs(k-1);
}
int main()
{while(scanf("%d%d", &big, &small), big || small){if(small > big) swap(small, big);mul1 = 1, mul2 = 1;f1 = 0, f2 = 0;dfs(100);if(f1 && f2 || !f1 && !f2){printf("%d\n", big);}else{if(f1) printf("%d\n", small);else printf("%d\n", big);}}//cout << f1 << f2;return 0;
}

Problem H 字母转换

时限:1000ms 内存限制:10000K 总时限:3000ms

描述:

通过栈交换字母顺序。给定两个字符串,要求所有的进栈和出栈序列(i表示进栈,o表示出栈),使得字符串2在求得的进出栈序列的操作下,变成字符串1。输出结果需满足字典序。例如TROT 到 TORT:
[
i i i i o o o o
i o i i o o i o
]

输入:

给定两个字符串,第一个字符串是源字符串,第二个字符是目标目标字符串。

输出:

所有的进栈和出栈序列,输出结果需满足字典序

输入样例:

madam
adamm
bahama
bahama
long
short
eric
rice

输出样例:

[
i i i i o o o i o o
i i i i o o o o i o
i i o i o i o i o o
i i o i o i o o i o
]
[
i o i i i o o i i o o o
i o i i i o o o i o i o
i o i o i o i i i o o o
i o i o i o i o i o i o
]
[
]
[
i i o i o i o o
]
#include <cstdio>
#include <iostream>
#include <stack>
#include <cstring>
#include <vector>
using namespace std;
#define N 100005
char a[N], b[N];
stack<char> st;
vector<char> op;
int p = 1;
int q = 1;
int len = 0;
void dfs(int n)
{if(n > 2 * len){for(int i = 0; i < op.size(); i++){if(i != op.size() - 1)printf("%c ", op[i]);else printf("%c", op[i]);}puts("");return;}if(p <= len){op.push_back('i');st.push(a[p]);p++;dfs(n+1);op.pop_back();st.pop();p--;}if(st.size() && st.top() == b[q]){op.push_back('o');char tmp = st.top();st.pop();q++;dfs(n+1);q--;st.push(tmp);op.pop_back();}
}
int main()
{//freopen("in.txt", "r", stdin);//freopen("out.txt", "w", stdout);while(scanf("%s%s", a+1, b+1) != EOF){int len1 = strlen(a+1);int len2 = strlen(b+1);if(len1 != len2){printf("[\n]\n");continue;}len = len1;printf("[\n");dfs(1);printf("]\n");}return 0;
}

Problem I 农场灌溉问题

时限:1000ms 内存限制:10000K 总时限:3000ms

描述:

一农场由图所示的十一种小方块组成,蓝色线条为灌溉渠。若相邻两块的灌溉渠相连则只需一口水井灌溉。

输入:

给出若干由字母表示的最大不超过50×50具体由(m,n)表示,的农场图

输出:

编程求出最小需要打的井数。每个测例的输出占一行。当M=N=-1时结束程序。

输入样例:

2 2
DK
HF
3 3
ADC
FJK
IHE
-1 -1

输出样例:

2
3

简直是带模拟

需要注意判断可达性的时候,不仅仅与当前的格子有关系,并且与其他的格子有关系。

#include <iostream>
#include <cstdio>using namespace std;bool th[128][5];
int n,m;
char a[100][100];
bool v[100][100];
void init();
void dfs(int x, int y)
{v[x][y] = 1;int r, c;//0r = x, c = y-1;if(r >= 1 && r <= n && c >= 1 && c <= m && !v[r][c]){if(th[a[x][y]][0] && th[a[r][c]][2]){dfs(r, c);}} //1r = x-1, c = y;if(r >= 1 && r <= n && c >= 1 && c <= m && !v[r][c]){if(th[a[x][y]][1] && th[a[r][c]][3]){dfs(r, c);}} //2r = x, c = y+1;if(r >= 1 && r <= n && c >= 1 && c <= m && !v[r][c]){if(th[a[x][y]][2] && th[a[r][c]][0]){dfs(r, c);}} //3r = x+1, c = y;if(r >= 1 && r <= n && c >= 1 && c <= m && !v[r][c]){if(th[a[x][y]][3] && th[a[r][c]][1]){dfs(r, c);}}
}
int main()
{init();while(scanf("%d%d", &n, &m), n!=-1 || m!=-1){for(int i = 1; i <= n; i++)for(int j = 1; j <= m; j++)v[i][j] = 0;for(int i = 1; i <= n; i++) scanf("%s", a[i] + 1);int ans = 0;for(int i = 1; i <= n; i++)for(int j = 1; j <= m; j++){if(!v[i][j]) {dfs(i, j);ans ++;}}printf("%d\n", ans);// for(int i = 1; i <= n; i++)// {//     for(int j = 1; j <= m; j++)//         cout << a[i][j];//     puts("");// }}return 0;
}
void init()
{th['A'][0] = 1;th['A'][1] = 1;th['B'][1] = 1;th['B'][2] = 1;th['C'][0] = 1;th['C'][3] = 1;th['D'][2] = 1;th['D'][3] = 1;th['E'][1] = 1;th['E'][3] = 1;th['F'][0] = 1;th['F'][2] = 1;th['G'][0] = 1;th['G'][1] = 1;th['G'][2] = 1;th['H'][0] = 1;th['H'][1] = 1;th['H'][3] = 1;th['I'][0] = 1;th['I'][2] = 1;th['I'][3] = 1;th['J'][1] = 1;th['J'][2] = 1;th['J'][3] = 1;th['K'][0] = 1;th['K'][1] = 1;th['K'][2] = 1;th['K'][3] = 1;}

Problem J 求图像的周长

时限:1000ms 内存限制:10000K 总时限:3000ms

描述:

给一个用 . 和X表示的图形,图形在上、下、左、右、左上、左下、右上、右下8个方向都被看作是连通的,并且图像中间不会出现空洞,求这个图形的边长。

输入:

首先给出m、n、x、y四个正整数,下面给出m×n的图形,x、y表示点击的位置,全0表示结束。

输出:

点击的图形的周长。

输入样例:

2 2 2 2
XX
XX
6 4 2 3
.XXX
.XXX
.XXX
...X
..X.
X...
0 0 0 0

输出样例:

8
18
#include <iostream>
#include <cstdio>
using namespace std;
#define N 10005
int n, m, sx, sy;
char a[N][N];
bool v[N][N];
int ans = 0;
int dx[8] = {-1, -1, -1 ,0, 0, 1, 1, 1};
int dy[8] = {-1, 0, 1, -1, 1, -1, 0, 1};int lenth(int nx, int ny)
{int all = 4;static const int qx[4] = {-1, 0, 0, 1};static const int qy[4] = {0, -1, 1, 0};for(int k = 0; k < 4; k++){int x = nx + qx[k];int y = ny + qy[k];if(x < 1 || x > n || y < 0 || y > m) continue;if(a[x][y] == 'X')all --;}return all;
}void dfs(int nx, int ny)
{v[nx][ny] = 1;ans += lenth(nx, ny);for(int k = 0; k < 8; k++){int x = dx[k] + nx;int y = dy[k] + ny;if(v[x][y]) continue;if(a[x][y] != 'X') continue;dfs(x, y);}
}
int main()
{while(scanf("%d%d%d%d", &n, &m, &sx, &sy), n || m || sx || sy){for(int i = 1; i <= n; i++) scanf("%s", a[i]+1);for(int i = 1; i <= n; i++)for(int j = 1; j <= m; j++)v[i][j] = 0;ans = 0;dfs(sx, sy);printf("%d\n", ans);}return 0;
}

Problem K 图的m着色问题

时限:1000ms 内存限制:10000K 总时限:3000ms

描述:

给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。如果有一种着色法使G中每条边的2个顶点着不同颜色,则称这个图是m可着色的。图的m着色问题是对于给定图G和m种颜色,找出所有不同的着色法。

输入:

第1行有3个正整数n,r 和m(n < 20,r < 200,m < 10),表示给定的图G有n个顶点和r条边,m种颜色。顶点编号为0,1,2,…,n-1。接下来的r行中,每行有2个正整数u,v,表示图G 的一条边(u,v)。

输出:

输出不同的着色方案的总数。

输入样例:

3 2 2
0 1
1 2

输出样例:

2
#include <iostream>
#include <cstdio>
using namespace std;
#define N 25
int a[N][N];
int c[N];
int n, r, m;
int ans = 0;
inline bool ck(int x, int val)
{for(int y = 1; y < x; y++){if(!a[x][y]) continue;if(val == c[y]) return 0;}return true;
}
void dfs(int x)
{if(x > n){ans ++;// for(int i = 1; i <= n; i++) printf("%d ", c[i]);// puts("");return;}for(int i = 1; i <= m; i++){if(ck(x, i)) {c[x] = i;dfs(x+1);c[x] = 0;//浅浅回复一下} }
}
int main()
{   scanf("%d%d%d", &n, &r, &m);for(int i = 1; i <= r; i++){int u, v;scanf("%d%d", &u, &v);u++, v++;a[u][v] = 1;a[v][u] = 1;}dfs(1);printf("%d\n", ans);return 0;
}

Problem L 三阶幻方

时限:1000ms 内存限制:10000K 总时限:3000ms

描述:

三阶幻方是最简单的幻方,又叫九宫格,是由1,2,3,4,5,6,7,8,9九个数字组成的一个三行三列的矩阵,其对角线、横行、纵向的的和都为15。

输入:

输出:

按字典序输出所有的满足条件的幻方矩阵,每两个数字之间带一个空格,行尾无空格,每个幻方后带一个空行。

无输入以及输出样例

//幻方!都可以幻方!!!!
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
bool v[12];
int a[4][4];
inline bool judge(int x, int y, int val)
{//DEBUG//return true;int sum = 0;if(x == 0 && y == 2){for(int i = 0; i < 3; i++) sum += a[0][i];if(sum == 15) return true;else return false;}if(x == 1 && y == 2){for(int i = 0; i < 3; i++) sum += a[1][i];if(sum == 15) return true;else return false;}if(x == 2 && y == 0){int s1 = 0, s2 = 0;;for(int i = 0; i < 3; i++) s1 += a[i][0];s2 += a[0][2] + a[1][1] + a[2][0];;if(s2 == 15 && s1 == 15) return true;else return false;}if(x == 2 && y == 1){for(int i = 0; i < 3; i++) sum += a[i][1];if(sum == 15) return true;else return false;}if(x == 2 && y == 2){int s1 = 0, s2 = 0, s3 = 0;for(int i = 0; i < 3; i ++) s1 += a[i][2];for(int i = 0; i < 3; i ++) s2 += a[i][i];for(int i = 0; i < 3; i ++) s3 += a[2][i];if(s1 == 15 && s2 == 15 && s3 == 15) return true;else return false;}return true;
}//int dede = 0;
void dfs(int p)
{if(p >= 3*3){for(int i = 0; i < 3; i++){for(int j = 0; j < 3; j++){if(j < 2)printf("%d ", a[i][j]);elseprintf("%d", a[i][j]);}puts("");}puts("");//if(++dede >= 5) exit(0);}int nx = p/3;int ny = p%3;for(int i = 1; i <= 9; i++){a[nx][ny] = i;if(judge(nx, ny, i) && !v[i]){v[i] = 1;dfs(p+1);v[i] = 0;}a[nx][ny] = 0;}
}
int main()
{dfs(0);return 0;
}

算法分析与设计 西工大 noj 第二次实验相关推荐

  1. 西工大c语言noj作业答案,西工大noj答案

    西工大noj答案 [篇一:西工大poj100题(全新)] 圆及圆球等的相关计算 #includestdio.h int main() { int a,b,sum; scanf(%d %d,a,b); ...

  2. 西工大NOJ数据结构理论——013.以十字链表为存储结构实现矩阵相加(严5.27)

      我第一下拿到这个题目,第一反应就是先定义好数据结构,然后构建好十字链表基础操作的函数,也就是"创插遍历"这些操作.下面是我的定义和函数操作. typedef int ElemT ...

  3. 西工大NOJ数据结构理论——021.逆波兰表达式(严7.38)

    这道题我参考的是(80条消息) 『西工大-数据结构-NOJ』 021-逆波兰表达式(耿7.38) 『西北工业大学』__LanXiu的博客-CSDN博客 (准确来说是快期末考试了,所以各科老师都在疯 狂 ...

  4. 西工大NOJ数据结构理论——017.输出以二叉树表示的算术表达式(严6.51)

    (17条消息) 『西工大-数据结构-NOJ』 017-输出以二叉树表示的算术表达式(耿6.51) 『西北工业大学』__LanXiu的博客-CSDN博客 上面是我参考的一位学长的博客. 先序建立二叉树, ...

  5. 西工大NOJ数据结构实验——2.1稀疏矩阵转置

    对稀疏矩阵进行转置操作,按照老师讲的,有两种办法.我用的是第一种最简单的,从上到下一行一行得走,虽然速度很慢,但是简单. 说实话这个题目很讨厌,我们定义的三元组里面mu表示的是行数,但是题目要求输入的 ...

  6. 西工大NOJ数据结构理论——014.求广义表深度(严5.30)

    第一下拿到这道题,我的脑袋轰一下就大了.如果说用"括号匹配"来做的话,这其实很简单.但是如果要用广义表来做的话,难度哗哗哗的就涨上来了.为什么呢?首先,要把读入的字符串存到广义表里 ...

  7. c语言边沿与内芯的差noj题目,西工大noj答案完整版148.doc

    绝对是史上最全版(不止100题哦--按首字母排序) "1"的传奇 A+B A+BⅡ AB ACKERMAN Arithmetic Progressions Bee Checksum ...

  8. 西工大NOJ数据结构理论——007.表达式括号与匹配(严3.19)

    害怕提交次数过多,然后不再跑代码,影响成绩,所以又重新创建了两个号来测这道题. 结果全都正确,但就是一直"WA",然后Debug了近5个小时才把"WA"改成&q ...

  9. 西工大NOJ数据结构理论——015.建立二叉树的二叉链表存储结构(严6.70)

    我相信,大家都已经了解了这道题的背景,以及明白了我们需要做的事情. 对于这道题的背景,相信大家都熟悉,所以就不说了. 关于我们需要做的事情,大家也已经有了自己的思路.所以,我只在下面简短的写一写我的思 ...

最新文章

  1. 揭秘丨“北京八分钟”里中国制造的科技力量
  2. openFeign 服务接口的调用01——概述
  3. 布局管理器 5-----绝对布局
  4. java head head.next_Java: 链表head取出用后,置next=null为何可以加速gc?
  5. 文件服务器定时开关机,如何配置作服务器定时开关机.ppt
  6. 痞子衡嵌入式:第一本Git命令教程(4)- 转移(add/rm/mv)
  7. html跑马灯可以上下动ma,使用 JS 实现上下滚动走马灯
  8. AUTOSAR从入门到精通100讲(二十八)-AutoSar之CAN网络管理
  9. springmvc通过@Value注解读取Properties配置文件的值,junit测试可以取到值,但是在业务中无法读取
  10. C 温故知新 之 指针:函数指针变量、指针型函数
  11. PyCharm将制表符转换为空格并显示的配置方法
  12. SCCM2007系列教程之八资产管理
  13. 如何用C#写一个简单的Login窗口
  14. Gradle与Gradle插件
  15. asp.net中commandname应用
  16. 调通sina33m下的AP6212A0版本(分色排版)V1.0版本
  17. linux系统安装m1136打印机,Ubuntu 安装及共享打印机
  18. javascript new对象的过程
  19. excel冻结指定行和列
  20. 两南之行,自然文艺、轻奢浪荡

热门文章

  1. 10部小小孩绝对会爱的英文原版动画片
  2. 解惑五-开源数据库与商用数据库
  3. 利用matlab/simulink绘制bode图,以及用origin绘制反正切函数
  4. LSTM outputs和state outputs[:, -1, :] outputs[ -1]
  5. 学《老炮儿》打情义牌 客户不请自来(转自亿客CRM)
  6. 道指mt4代码_2019道指实时行情怎么看?
  7. 基于 wemos d1 智能感应开盖垃圾桶
  8. CUFFS超经典作品推荐 アメサラサ ~雨と、不思議な君に、恋をする~ (下载,介绍,攻略,存档)
  9. mobiscroll之treelist使用
  10. 傲游网络安全浏览器最新发布,四大企业结安全联盟